c++ Primer 第九章不熟悉知识点总结
1、顺序容器
vectror 可变大小数组,支持快速随机访问,在尾部之外的位置增删元素速度可能很慢。
deque 双端队列,支持快速随机访问,在头尾增删元素很快。
list 双向链表,只支持双向顺序访问,任何位置增删速度都很快。
forward_list 单向链表,只支持单向顺序访问,任何位置增删速度都很快。
array 固定大小数组,支持快速随机访问,不能增删元素。
string 与vector相似的容器,但专门用于保存字符。
通常,使用vector是最好的选择,除非你有很好的理由选择其他容器。
(1)容器中的迭代器可以指向上个位置(--(c.begin())),或者指向下个位置(++(c.begin()))
(2)迭代器c.cbegin()是值返回的是const指针,其他带c的也是一样的,带r表实是反向,比如c.rbegin()指的是末尾的位置。
(3)当我们把一个容器初始化为另一个容器的时候有两种方式:第一中就是直接拷贝相同类型的容器即可,另一种就是把一个容器的元素拷贝到另一个容器,这部分元素可以是其中的一部分。
1 std::vectortemp1; 2 std::vector temp2(temp1); 3 std::deque temp3(temp1.begin(), temp1.begin());
(4)assgin函数的使用
1 temp1.assign(temp2.begin(), temp2.end()); 2 temp2.assign(7, "hi");
把以前的内容清除,且赋值新的内容,要么是一个容器内的元素,或者给与他特定个数的值。
(5)swap函数的使用
swap是把两个容器的元素进行对换。
1 std::vector<int> temp1; 2 std::vector<int> temp2; 3 temp1.swap(temp2); 4 swap(temp1, temp2);
统一使用非成员版本的swap是一个好习惯。
(6)访问成员函数返回的是引用
1 auto ex1 = temp1.back(); 2 ex1 = 5; //temp1.back()的值并没有改变,还是原来的值 3 auto &ex2 = temp1.front(); 4 ex2 = 5; //temp1.front()的值改变了
所以我们想要改变值的时候注意是否赋值的是引用,当然我们使用下标的时候可以直接赋值,因为下标访问也是引用。
(7)不要保存end返回的迭代器
当删除或者新增之后,原来的end返回的迭代器总会失效。所以我们在循环中必须反复调用end,而不能在循环外面保存end返回的迭代器。
(8)string中的额外的构造函数
1 string str1 = "Hello World"; 2 string str2(str1, 5); //表示从str1[5]开始拷贝 3 string str3(str1, 6, 3); //表示从str1[6]开始拷贝3个字符 4 5 char arr1[11] = "HelloWorld"; //不是以空字符结束的字符串 6 const char *arr2 = "HelloWorld"; //以空字符结束的字符串 7 string str4(arr2, 2); //表示拷贝arr2的前两个字符
substr函数
str1.substr(1, 2); //表从str1[1]开始拷贝2个字符 str1.substr(1); //表从str1[1]开始拷贝
append和replace函数
str1.append("str"); //将一个字符串增加str1的末尾,返回一个指向str1的引用 str1.replace(str2.begin(), str2.end() , "str") //将一个范围内的内容删除,然后替换为str(其中rang可以是一组迭代器,也可以是下标组)
find函数
1 str1.find("ss"); //查找ss在str1中第一次出现的位置返回,指定从第二个字符开始,下面同样 2 str1.rfind("ss"); //查找ss在str1中最后一次出现的位置返回 3 str1.find_first_of("ss"); //查找“ss”中任何一个字符第一次出现的位置 4 str1.find_last_of("ss"); //查找“ss”中任何一个字符最后一次出现的位置 5 str1.find_first_not_of("ss"); //查找第一个不在“ss”中的字符 6 str1.find_first_not_of("ss"); //查找最后一个不在“ss”中的字符
compare函数
1 str1.compare(str2); //比较函数,可以指两个字符串的位置,返回值为0,正,负