#if false ios

2016-12-04 11:46:59 GULINHAI12 阅读数 24738

转载请标明出处:
http://blog.csdn.net/hai_qing_xu_kong/article/details/53453520
本文出自:【顾林海的博客】

前言

变量是与某块数据相关联的名称,而函数就是与某块代码相关联的名称,程序向函数传递信息,函数会去执行并返回相应的信息。

实例

#include "stdio.h"

#define BOOL int
#define TRUE 1
#define FALSE 0


BOOL flag = FALSE;

BOOL isError(float weight){

    flag=weight>56?FALSE:TRUE;

    return flag;

}

int main(int argc, const char * argv[]) {
    float weight=56.23;

    isError(weight)?printf("error \n"):printf("weight=%f \n",weight);

    return 0;
}

还是上篇笔记中的程序,isError就是一个函数,在函数名左侧的BOOL是函数返回信息的数据类型,如果函数没有任何信息需要返回,可以使用void关键字。
在小括号中是形参,形参由两部分组成:形参所代表的数据的类型和形参名称。形参必须写在小括号中,多个形参以逗号分隔。

局部变量、作用域、全局变量以及静态变量

#include "stdio.h"

#define BOOL int
#define TRUE 1
#define FALSE 0

static int errorCode=0x02;

BOOL flag = FALSE;

BOOL isError(float weight){

    if(weight<56){
        float count=weight*1.5;
        printf("count=%f \n",count);
        flag=FALSE;
    }else{
        printf("error [%d] \n",errorCode);
        flag=TRUE;
    }

    return flag;

}

int main(int argc, const char * argv[]) {
    float weight=57;
    isError(weight);
    return 0;
}

任何函数都可以有局部变量,局部变量是函数内部声明的变量,如上面程序中count变量就是局部变量。局部变量只有在声明它的函数执行时才会存在,且只能在该函数内部访问。
在函数中,一对花括号{} 中的内容定义了函数的作用域,变量只在声明它的作用域中有效,比如上面的count只在weight<56 时才有效。
程序除了只在函数运行时才会存在的局部变量,还有任何函数都可以在任意时刻访问的变量,这种变量被称为全局变量。全局变量只在函数外声明。例如上面程序中的flag,借助C语言的宏定义,定义了一个布尔变量。
静态变量与全局变量一样,不同的是,只有声明某个静态变量的文件时才能访问该变量,这样,静态变量既保留了非局部的、存在于任何函数之外的优点,又避免了会被其他文件修改的问题。

2017-09-20 14:53:06 a645258072 阅读数 4464

1. iPhone X tabbar 高度为 83 ,其余机型为49;  导航栏+状态高度为 88,其余为64

官方适配标准如下图:


2. UITableview 顶部出现留白

解决方法: 添加以下代码

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        return nil
    }
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        return nil
    }

3. iOS 11 弃用 automaticAdjustsScrollViewInsets 新增 contentInsetAdjustmentBehavior

        if #available(iOS 11.0, *) {
            tableView.contentInsetAdjustmentBehavior = .never
        } else {
            self.automaticallyAdjustsScrollViewInsets = false
        }


4. Xcode9向UIapplication 报告主线程调用 :[UIApplication statusBarOrientation]

Main Thread Checker: UI API called on a background thread: -[UIApplication statusBarOrientation]
PID: 22810, TID: 466328, Thread name: (none), Queue name: WriteLogQueue, QoS: 0
Backtrace:
4   Numerology                          0x0000000107a99468 -[SSDKContext screenResolution] + 88
5   Numerology                          0x0000000107aae942 +[SSDKLog encryptDeviceString] + 390
6   Numerology                          0x0000000107aa6900 __28-[SSDKRunLog getLogContent:]_block_invoke + 59
7   Numerology                          0x0000000107aae769 -[SSDKLog getLogContent:] + 654
8   Numerology                          0x0000000107aa68a6 -[SSDKRunLog getLogContent:] + 127
9   Numerology                          0x0000000107ac9523 __28-[SSDKLogService sendRunLog]_block_invoke + 138
10  libdispatch.dylib                   0x00000001115df3f7 _dispatch_call_block_and_release + 12
11  libdispatch.dylib                   0x00000001115e043c _dispatch_client_callout + 8
12  libdispatch.dylib                   0x00000001115e895b _dispatch_queue_serial_drain + 1162
13  libdispatch.dylib                   0x00000001115e92df _dispatch_queue_invoke + 336
14  libdispatch.dylib                   0x00000001115e507d _dispatch_queue_override_invoke + 733
15  libdispatch.dylib                   0x00000001115ec1f9 _dispatch_root_queue_drain + 772
16  libdispatch.dylib                   0x00000001115ebe97 _dispatch_worker_thread3 + 132
17  libsystem_pthread.dylib             0x0000000111a9c5a2 _pthread_wqthread + 1299
18  libsystem_pthread.dylib             0x0000000111a9c07d start_wqthread + 13

解决方法: 取消勾选部分




5.  关于嵌套tableview后,刷新列表,导致列表向上偏移的问题

原因: iOS 8  引入了Self-Sizing后,我们可以通过estimatedRowHeight来估算每个cell的高度。iOS11 Self-Sizing 默认开启,estimatedRowHeight会由之前的 0 改变为UITableViewAutomaticDimension, 之前项目中,没有使用estimatedRowHeight,在刷新列表的时候,会重新计算 contentSize,进而影响到contentOffSet

解决方法: 
            tableView.estimatedRowHeight = 0.0
            tableView.estimatedSectionFooterHeight = 0.0
            tableView.estimatedSectionHeaderHeight = 0.0


6. 关于iOS 11 新特性: 大标题prefersLargeTitles

显示大标题 

navigationController.navigationBar.prefersLargeTitles = true
修改大标题颜色,字号等

navigationController.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.orange,
                                                                                NSAttributedStringKey.font: UIFont.systemFont(ofSize: 36)]
大标题显示样式

 navigationItem.largeTitleDisplayMode = .automatic
此处说明一下显示样式,默认显示样式为automatic:由前一个界面的设置的显示样式决定。 always:不管其他界面,如何设置,当前只要设置样式为always,则一直显示大标题,不会因界面滚动而显示小标题。  never:与always相反,一直显示小标题




2017-04-23 17:23:26 u014665013 阅读数 1526

原文地址:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html

               http://www.clanfei.com/2012/03/235.html

在网上查看别人的ACM代码时,发现别人输入输出语句用的总是scanf与printf,有点不解,还以为他们用的都是C语言,而非C++,但今天做的一道题(Sort):

发现与网上的其他高手使用完全相同的方法,使用scanf及printf的代码提交后Accepted,而使用cin及cout的却Time Limit Exceeded,代码如下:

代码一(Accepted):

  1. #include<iostream>
  2. using namespace std;
  3. bool a[1000001];
  4. int main()
  5. {
  6. int n, m, num, count;
  7. while(scanf("%d%d",&n,&m)!=EOF){
  8. memset(a, 0, sizeof(a));
  9. for(int i=0; i<n; i++){
  10. scanf("%d",&num);
  11. a[num + 500000] = 1;
  12. }
  13. count = 0;
  14. for(int j = 1000000; j >= 0; --j){
  15. if(a[j]){
  16. if(count == m - 1){
  17. printf("%d\n",j-500000);
  18. break;
  19. }
  20. printf("%d ",j-500000);
  21. count++;
  22. }
  23. }
  24. }
  25. return 0;
  26. }

代码二(Time Limit Exceeded):

  1. #include<iostream>
  2. using namespace std;
  3. bool a[1000001];
  4. int main()
  5. {
  6. int n, m, num, count;
  7. while(cin >> n >> m){
  8. memset(a, 0, sizeof(a));
  9. for(int i=0; i<n; i++){
  10. cin >> num;
  11. a[num + 500000] = 1;
  12. }
  13. count = 0;
  14. for(int j = 1000000; j >= 0; --j){
  15. if(a[j]){
  16. if(count == m - 1){
  17. cout << j - 500000 << endl;
  18. break;
  19. }
  20. cout << j - 500000 << " ";
  21. count++;
  22. }
  23. }
  24. }
  25. return 0;
  26. }

可以看出,代码思路完全一样,只是输入输出方法不同,问过老师,加上这一句代码后使用cin及cout也可以Accepted:

  1. std::ios::sync_with_stdio(false);

百 度了一下,原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是 iostream。

 

 

我是怎么在不知道这一对函数的情况下活到今天的,以前碰到cin TLE的时候总是傻乎乎地改成scanf,甚至还相信过C++在IO方面效率低下的鬼话,殊不知这只是C++为了兼容C而采取的保守措施。

tie

tie是将两个stream绑定的函数,空参数的话返回当前的输出流指针。

  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. ///////////////////////////SubMain//////////////////////////////////
  5. int main(int argc, char *argv[])
  6. {
  7. std::ostream *prevstr;
  8. std::ofstream ofs;
  9. ofs.open("test.txt");
  10.  
  11. std::cout << "tie example:\n"; // 直接输出到屏幕
  12.  
  13. *std::cin.tie() << "This is inserted into cout\n"; // 空参数调用返回默认的output stream,也就是cout
  14. prevstr = std::cin.tie(&ofs); // cin绑定ofs,返回原来的output stream
  15. *std::cin.tie() << "This is inserted into the file\n"; // ofs,输出到文件
  16. std::cin.tie(prevstr); // 恢复
  17.  
  18. ofs.close();
  19. system("pause");
  20. return 0;
  21. }
  22. ///////////////////////////End Sub//////////////////////////////////

输出:

  1. tie example:
  2. This is inserted into cout
  3. 请按任意键继续. . .

同时当前目录下的test.txt输出:

  1. This is inserted into the file

sync_with_stdio

这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。

应用

在ACM里,经常出现 数据集超大造成 cin TLE的情况。这时候大部分人(包括原来我也是)认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其 实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf 之类。

在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

如下所示:

    1. #include <iostream>
    2. int main() 
    3. {
    4.     std::ios::sync_with_stdio(false);
    5.     std::cin.tie(0);
    6.     // IO
    7. }






2018-12-12 16:19:49 weixin_44015865 阅读数 6522

在C++中的输入和输出有两种方式,一种是scanf和printf,另一种是cin和cout,在#include<bits/stdc++.h>这个万能头文件下,这两种方式是可以互换的
C++和C很相似,很多大佬都用C++写C,但是在后面的一种方式中cin和cout的输入和输出效率比第一种低,原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是 iostream。
在学校的OJ上后面的时间复杂度要求很低,有好多时候TLE不是因为代码的问题,对于初学C++的人来说根本不知道ios::sync_with_stdio(false);这个东西。
以下代码是SDUT上的一个数据结构的题目
Logout
顺序表应用4-2:元素位置互换之逆置算法(数据改进)
Time Limit: 80 ms Memory Limit: 600 KiB

Problem Description
一个长度为len(1<=len<=1000000)的顺序表,数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1<=m<=len),设计一个时间复杂度为O(N)、空间复杂度为O(1)的算法,改变原来的顺序表,把顺序表中原来在前的m个元素放到表的后段,后len-m个元素放到表的前段。
注意:交换操作会有多次,每次交换都是在上次交换完成后的顺序表中进行。

Input
第一行输入整数len(1<=len<=1000000),表示顺序表元素的总数;

第二行输入len个整数,作为表里依次存放的数据元素;

第三行输入整数t(1<=t<=30),表示之后要完成t次交换,每次均是在上次交换完成后的顺序表基础上实现新的交换;

之后t行,每行输入一个整数m(1<=m<=len),代表本次交换要以上次交换完成后的顺序表为基础,实现前m个元素与后len-m个元素的交换;

Output
输出一共t行,每行依次输出本次交换完成后顺序表里所有元素。

Sample Input
10
1 2 3 4 5 6 7 8 9 -1
3
2
3
5
Sample Output
3 4 5 6 7 8 9 -1 1 2
6 7 8 9 -1 1 2 3 4 5
1 2 3 4 5 6 7 8 9 -1

//TLE超时代码
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
void creatlist(int n)
{
    for(int i=0; i<=n-1; i++)
    {
        cin>>a[i];
    }
}
void changelist(int n,int m)
{
    int t;
    while(n<m)
    {
        t=a[n];
        a[n]=a[m];
        a[m]=t;
        n++;
        m--;
    }
}
void finally(int m,int len)
{
    changelist(0,len-1);
    changelist(0,len-1-m);
    changelist(len-m,len-1);

}
int main()
{
    int len;
    cin>>len;
    creatlist(len);
    int t;
    cin>>t;
    while(t>0)
    {
        int m;
        cin>>m;
        finally(m,len);
        for(int i=0; i<=len-1; i++)
        {
            if(i==len-1)
            {
                cout<<a[i]<<endl;
            }
            else
            {
                cout<<a[i]<<" ";
            }
        }
        t--;
    }
    return 0;
}

这是我用cout输出cin输入的代码,结果是TLE,而下面的AC代码

//AC代码
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
void creatlist(int n)
{
    for(int i=0; i<=n-1; i++)
    {
        cin>>a[i];
    }
}
void changelist(int n,int m)
{
    int t;
    while(n<m)
    {
        t=a[n];
        a[n]=a[m];
        a[m]=t;
        n++;
        m--;
    }
}
void finally(int m,int len)
{
    changelist(0,len-1);
    changelist(0,len-1-m);
    changelist(len-m,len-1);

}
int main()
{
    ios::sync_with_stdio(false);
    int len;
    cin>>len;
    creatlist(len);
    int t;
    cin>>t;
    while(t>0)
    {
        int m;
        cin>>m;
        finally(m,len);
        for(int i=0; i<=len-1; i++)
        {
            if(i==len-1)
            {
                cout<<a[i]<<endl;
            }
            else
            {
                cout<<a[i]<<" ";
            }
        }
        t--;
    }
    return 0;
}

可以看出这两段代码只有输入输出方式不同,但是提交结果一个AC一个TLE,在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据,知道了ios::sync_with_stdio(false);这个可以大幅提高大数据的输入和输出以节省时间

2016-12-16 18:49:07 BX_Jobs 阅读数 719

做滚动分页视图的时候,遇到了一个很奇怪的问题,在iphone6 ios9上每一个子控制器可以进viewwillappear,在iphone6splus ios10上不进viewwillappear,后来了解到ios10对collectionview优化预加载什么的,我改成了 if #available(iOS 10.0, *) {

collectionView.isPrefetchingEnabled = false
} else {
// Fallback on earlier versions
}
根据测试有效