C++学习笔记

来源:互联网 发布:java自然语言处理 pdf 编辑:程序博客网 时间:2024/06/07 08:30

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不包含\0string 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[] --> stringchar 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.1vector<double> vec{1.1, 1};auto res = accumulate(vec.cbegin(), vec.cend(), 0.0)//10.5//10.7
0 0
原创粉丝点击