【C++ Primer Chapter 3 总结】Library vector & string Type
1.A vector is a class template, a string is class. 模板(template)本身不是函数/类,但是可以指导编译器生成函数/类,该过程叫做实例化(instantiation)。
//常用初始化方法 vector<T> V(n, val); vector<T> V = {val1, val2, val3}; vector<T> V = V2; vector<vector<T>> V(n, vector<T>(m, val));
2.vector有下标符[],但是该符号只能访问已经存在的元素!vector使用push_back()添加新元素!
//常用操作
V.empty();
V.size();
V.push_back();
V.pop_back();
V.emplace_back(); //c++11新特性,会自动调用构造函数
V.begin(); //返回第一个元素的迭代器
V.rbegin(); //返回最后一个元素的迭代器 reverse的begin()
V.end(); //返回最后一个元素后一个位置的迭代器
V.rend(); //返回第一个元素前一个位置的迭代器 reverse的end()
V.cbegin(); //const_iterator,指向const元素,不能用于修改迭代器指向的元素
V.cend(); //const_iterator
V.crbegin(); //const_iterator
V.crend(); //const_iterator
V[index] // vector的下标操作符只能访问存在的变量,不能添加元素,区别于map容器
V1 == V2
3.所有容器(container)都有迭代器(iterator)。我们不关心迭代器的类型,可以是容器的成员函数begin()返回的类型。
auto b = C.begin(); //begin()指向容器的第一个元素,如果容器为空,C.begin()==C.end() auto e = C.end(); //end()指向容器最后一个元素的下一个位置,off-the-end,标志着我们处理完了容器中所有的元素,注意这里C.end()位置是不存在的元素,是不可访问的!
4.iterator和const_iterator。const_iterator类似于const pointer,对于const_iterator表示的元素只读不可写,即不可通过迭代器改变元素的值。
const_iterator可以指向const元素和非const元素,但是iterator不能指向const元素。
vector<int> V; const vector<int> CV; auto it1 = V.begin(); auto it2 = CV.begin(); //相当于 const vector<int> const_iterator it2 = CV.cbegin();
5.Array数组数据结构。
char a[6] = "hello"; //string类型初始化字符数组,不用显示添加'\0',因为string字符以'\0'结尾,复制时会一起被复制到字符数组中 char a[6] = {'h','e','l','l','o','\0'}; cout << sizeof(a) / sizeof(*a) << endl; //数组长度
6.理解复杂数组的声明。从右到左,从内到外读。
int *ptrs[10]; //ptsr是大小为10的数组(ptrs[10]),数组元素是指向int的指针(int*)
int &refs[10] = /* ? */; //error:因为没有引用数组。因为数组元素是object,引用不是一个具体的object,只是object的别名
int (*parray)[10] = &arr; //parray是指针(*parry),指向大小为10的数组([10]),数组元素是int
int(&arrRef)[10] = arr; //arrRef是引用(&arrRef),引用的是大小为10的数组([10]),数组元素是int
int *(&arry)[10] = ptrs; //10个指针的数组的引用:arry是引用(&arry),引用的是大小为10的数组([10]),数组元素是指向int的指针(int*)
7.数组的特殊属性。在大多数情况使用数组的时候,编译器会自动使用指向数组第一个元素的指针替代数组类型。
使用auto定义的变量推断出来的类型是指针,使用decltype推断出来的类型是数组。
string nums[] = {"one", "two", "three"}; string *p = nums; int ia[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; auto ia2(ia); // ia2是int*类型 *(ia2 + 4) = 42; decltype(ia) ia3 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // ia3是数组类型 ia3[4] = 42;
8.同容器成员函数begin()和end()一样,取数组的首位置和位置后一个位置的函数。可以用数组初始化vector。
#include <iterator>
int a[] = {1,2,3,4,5};
int *b = begin(a), *e = end(a);
vector<int> v(begin(a), end(a));
9.string初始化
string s1;
string s2(s1);
string s3("value");
string s3 = "value";
string s4(n, 'c'); // s4初始化为n个c字符
10.读取未知数量的字符串
string word;
while(cin >> word) {} // 以空格/换行为分隔符从输入流中读取字符串,直到end-of-file。cin返回istream&
string line;
while(getline(cin, line)) {} // 以换行符为分隔符从输入流中读取字符串,直到end-of-file。getline()返回istream&. 注意getline会读取流中的换行符,但是不会保存到string变量中。
11.C-Style Charater Strings。C风格字符串。以空字符结束('\0')。
#include <cstring> char a[] = "hello", b[] = "C++"; strlen(a); strcmp(a, b); strcpy(a, b); strcat(a, b);
12.在任何可以使用字符串字面值(string literal)的地方都可以用空字符结束的字符数组代替。反之不成立:如果程序的某处需要一个C风格字符串,无法直接用string对象来代替。
string s = "hello"; char *str = s; //error:不能用string对象初始化char* const char *str = s.c_str(); //将string对象转成C类型字符串
13.string::size()成员函数返回类型是string::size_type类型,是一个无符号类型(unsigned type)。当表达式中包含string::size()和int类型的时候,int类型负数会被转换为一个很大的unsigned值。 sizeof(string::size_type) = 8
14.C++11数字类型转string。string转C类型字符串。C类型字符串转数字类型。
string s = to_string(num); char * cs; strcpy(cs, s.c_str()); int a = atoi(cs);
15.字符串流stringstream实现字符串和其他类型的转换。
string data = "1 2 3 4"; istringstream is(data); int a, sum = 0; while(is >> a){ sum += a; } cout << sum << endl; // 10
16.cctype头文件中对字符进行操作的函数。
isalnum(c) // letter or digit isalpha(c) // letter isdigit(c) // digit islower(c) isupper(c) tolower(c) toupper(c)
17.string拷贝构造函数。
string s(pointer_to_string, num); string s(src, pos); string s(src, pos, len); string s = "hello"; string t(s, 2); // t = "he" string t(s, 0); // t = "hello" string t(s, 0, s.size()); // t= "hello"
18.string子串。
string s = "hello;
str = s.substr(pos, len); // 起始位置,长度
19.string修改操作。
s.erase(pos, len); s.assign(args); // 将原字符串替换为参数内容 s.append(args); // 在字符串后追加参数内容 args: str / str, pos, len / begin, end / num, character_c
20.string查找操作。
s.find(args); // 第一次出现的位置 s.rfind(args); // 最后一次出现的位置 args: c, pos / str, pos // 字符c或字符串str在string s中从pos开始出现的位置