C++学习笔记

1.范围for循环

//将字符串s全变为大写
for(char &i : s) {
    i = toupper(i);//字符处理函数<cctype>
}

范围for语句是C++11标准,用g++编译时,需要加上-std=c++11,不然会提示range-based ‘for’ loops are not allowed in C++98 mode
范围for循环相对于传统for循环和while循环的优点是,我们无需关心循环边界条件,防止越界访问。

2.字符串输入

cin:忽略输入空白符

string temp;
while(cin >> temp){
    cout << temp <<endl;//temp中无换行符
}

用cin输入字符串,cin会忽略输入流中的空白(空格符、换行符、制表符等),将连续的字符提取出来。例如输入分隔开的”hello world!”,实际会进入两次while,temp先是”hello”,再是”world!”
这里写图片描述

getline():保留输入空白符

string temp;
while(getline(cin, temp){
    cout << temp <<endl;//temp中无换行符
}

用getline()输入字符串,可保留输入时的空白符。getline()在遇到换行符时会返回,返回时,不会将换行符保存到字符串中。
这里写图片描述

3.字符串、数组初始化

字符数组初始化

//错误,应该为char str[2] = "a";
char str[1] = "a";

//错误,字符数组未显式初始化
char str[5];
cout << str << endl;

//错误,不允许拷贝初始化
char a[] = b;

用字符串字面值初始化字符数组。上述语句会编译报错error: initializer-string for array of chars is too long"a"是字符串,编译器会在字符串后面添加一个空字符串'\0',因此字符串字面值的实际长度要比它的内容多1,数组中包含\0.
字符数组未显式初始化时,里面的内容是未定义的,我们不知道里面是什么内容。
数组不允许拷贝初始化。

字符串初始化

//正确,str不包含\0
string str = "a";

//正确,string未显式初始化,默认初始化为空串
string str;
cout << str <<endl;

//正确,string支持拷贝初始化
string a = b;

用字符串字面值初始化string对象。字符串字面值包含A\0,初始化时,除了最后的空子符外,其他的字符都被拷贝到新创建的string对象中,即string对象中不包含\0
string对象未显式初始化时,执行默认初始化,str是一个空字符串。
string对象支持拷贝初始化。

4.C++新接口与C旧接口的转换

//string --> char*
const char *str = s.c_str();//str必须为const

//char[] --> string
char str = "a";
string s = str;//对于string s = "a",我们可以将字符串字面值"a"替换为以空字符结尾的str

//int[] --> vector<int>
int arr[] = {0,1,2};
vector<int> vec(begin(arr), end(arr));

//vector<int> --> int[],for循环
vector<int> vec{0,1,2};
int arr[3];
for(int *i = begin(arr); i != end(arr); i++)
    *i = vector[i-begin(arr)];

1.迭代器end()指向尾元素的下一个元素,这样当begin!=end时,说明容器中还有内容。
2.迭代器的判断用!=而不用<,是因为所有标准容器的迭代器都支持!=,而运算符<并不是所有容器都支持。

5.STL中的一些坑

//accumulate的第三个参数如果是0,那么返回的是int型2;如果参数是0.0,那么返回的是double型2.1
vector<double> vec{1.1, 1};
auto res = accumulate(vec.cbegin(), vec.cend(), 0.0)

//10.5

//10.7
posted @ 2017-04-24 22:14  水煮海鲜  阅读(195)  评论(0编辑  收藏  举报