【C++ Primer Chapter 9 总结】顺序容器 & 容器适配器
Sequential Containers
-
vector
-
deque(双端对列)
-
list(链表)
-
string
-
array(替代内置数组)
-
forward_list(单链表)
Sequential Containers Adaptors
-
stack
-
queue
-
priority_queue
1.容器是类模板,要提供元素类型。
vector<int> v; list<TreeNode*> lst;
2.迭代器Iterator。[begin, end)表示容器中所有元素。
容器的类型成员:size_type, iterator, const_iterator, reverse_iterator,const_reverse_iterator。
反向迭代器,反向遍历容器。与正向迭代器相比,各种操作的含义发生了颠倒。
vector<int>::iterator it; // iterator是类型别名 vector<int> v; v.begin(); // 容器第一个元素 v.end(); //最后一个元素的后一个元素 vector<string> v = {"hello", "C++", "world"}; auto rit = v.rbegin(); // vector<string>::reverse_iterator, 反向迭代器,容器的从右边开始的第一个元素 auto cit = v.cbegin(); // vector<int>::const_iterator, 容器的从右边开始的第一个元素,不能通过迭代器改变容器元素 auto crit = v.rbegin(); // vector<int>::const_reverse_iterator, 容器的从右边开始的第一个元素,不能通过迭代器改变容器元素
sort(vec.begin(), vec.end());
sort(vec.rbegin(), vec.rend());
vector<string>::reverse_iterator rit; // rit只能从右向左遍历容器
rit.base(); // 获得与反向迭代器对应的正向迭代器,可以从左向右遍历
string line = "first, middle, last";
auto rcomma = find(line.crbegin(), line.crend(), ','); 找到最后一个单词
cout << string(line.crbegin(), rcomma) << endl; // tsal
cout << string(rcomma.base(), line.cend()) << endl; // last
3.使用其他容器初始化。容器类型和元素类型都要一致。
使用迭代器时,容器类型要一致,元素类型要可以转换。
list<string> la = {"Mike", "Alice", "May"}; list<string> lst(la); vector<string> vs(la.begin(), la.end());
4.顺序容器使用assign完成赋值操作。
list<string> names; vector<const char*> old; names = old; // error: 容器类型不一致 names.assign(old.cbegin(), old.end()); // const char* 可以转换到string names.assign(10, "Hi"); // 容器中为10个“Hi”元素
5.数组容器必须提供容器大小。容器大小是array类型的一部分。
虽然内置数组不能复制,但是array容器可以复制和赋值。
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; array<int, 42> a = arr; // error,数组大小不一致 array<string, 10> b = arr; // ok
6.C++11中的emplace_front, emplace, emplace_back。
emplace操作将接收的参数传递给元素类型的构造函数来构造容器元素。
vector<vector<string>> v; v.emplace_back(10, "Hi"); v.push_back(vector<string>(10, "Hi"));
7.容器适配器,在底层顺序容器上定义了新的接口,实现其他特定操作的新类型。
8.stack
stack<Type> st; st.push(x); st.emplace(args); st.pop(); st.top();
9.queue
queue<Type> que; que.push(x); que.emplace(args); que.pop(); que.front(); que.back();
10.priority_queue
priority_queue<Type, Container_Type, Compare> pq; pq.push(x); pq.emplece(args); pq.pop(); pq.top();