Vector
1. vector 是一种类模板。需要<vector> using std::vector 有两种初始化方法:
vector<int> v(10,0); // 10个0
vector<int> v{10,0}; // 10和0
vector<int> v(10); // 10个默认0
vector<int> v{10}; // 10
2. 主要操作有v.empty() v.size() v[n] v.push_back()
v.size() 类型为 vector<int>::size_type
for (auto i:v) {
cout<<i; // 可以访问,不能改变
}
for (auto &i:v) {
i++; // &i引用才能改变vector元素
}
for (decltype(v.size()) i=0; i<v.size(); ++i) {
v[i] = i; // 错误,v为空时v[i]未知,不能用下标添加vector元素
}
for (decltype(v.size()) i=0; i<v.size(); ++i) {
v.push_back(i); // 正确,应该使用push_back
}
3. 所有的容器类型以及string都支持迭代器,但只有少部分如vector容器以及string支持下标访问,所以尽量使用迭代器而非下标。
4. 迭代器的尾指针end()指向的是最后一个元素的后面一位,不能解引用以及移动位置。空容器的begin和end相等,都指向最后一个元素的后面一位。
5. 所有容器的迭代器都定义了!=和=,所以用!=判断迭代器位置而非<符号。
6. 迭代器有两种类型
vector<int>::iterator it; // 普通迭代器,可以修改元素
vector<int>::const_iterator it; // 常量迭代器,只能读,不能写,常量容器只能用常量迭代器
string::iterator it; // 同普通迭代器
auto it = v.cbegin(); // it的类型为常量迭代器
auto it = v.cend(); // it的类型为常量迭代器
(*it).empty(); // it所指元素是否为空
*it.empty(); // 错误,it是迭代器,不能判断empty
it->empty(); // 正确,->运算符是解引用和.的组合
7. 范围for和带有迭代器的循环体都不能改变容器的大小,只要容器大小改变了,范围for和迭代器都不起作用了。
8. 迭代器可以+n运算,两个迭代器之差的数据类型是vector<T> difference_type