—顺序容器:vector,list,queue
1.顺序容器的常见用法:
#include <vector>
#include <list>
#include <queue>
(1)vector声明
vector<string> svec;
(2)添加元素:
c.push_back(t): 在容器 c 的尾部添加值为 t 的元素。返回 void 类型 |
c.push_front(t):在容器 c 的前端添加值为 t 的元素。返回 void 类型 只适用于 list 和 deque 容器类型. |
c.insert(p,t):在迭代器 p 所指向的元素前面插入值为 t 的新元素。返回 指向新添加元素的迭代器 |
c.insert(p,n,t):在迭代器 p 所指向的元素前面插入 n 个值为 t 的新元素。 返回 void 类型 |
c.insert(p,b,e):在迭代器 p 所指向的元素前面插入由迭代器 b 和 e 标记 的范围内的元素。返回 void 类型 |
(3)访问元素:
c.back():返回容器 c 的最后一个元素的引用。如果 c 为空,则该操作 定 义 |
c.front():返回容器 c 的第一个元素的引用。如果 c 为空,则该操作 定义 |
c[n]:返回下标为 n 的元素的引用。如果 n <0 或 n >= c.size(),则该操作只适用于 vector 和 deque 容器 |
c.at(n)返回下标为 n 的元素的引用。如果下标越界,则该操作只适用于 vector 和 deque 容器 |
(4)删除元素:
c.erase(p)删除迭代器 p 所指向的元素。返回一个迭代器,它指向被删除元素后面的元素。如果 p 指向 容器内的最后一个元素,则返回的迭代器指向容器的超出 端 的下一位置。如果 p 身就是指向超出 端的下一位置的迭代 器。 |
c.erase(b,e):删除迭代器 b 和 e 所标记的范围内所有的元素。返回一个迭代器,它指向被删除元素段后面的元素。如果 e 身就是指向超出 端的下一位置的迭代器,则返回的迭代器也 指向容器的超出 端的下一位置 |
c.clear():删除容器 c 内的所有元素。返回 void |
c.pop_back():删除容器 c 的最后一个元素。返回 void。 |
c.pop_front():删除容器 c 的第一个元素。返回 void。如果 c 为空容器,则该函数只适用于 list 或 deque 容器 |
2.顺序容器的优缺点:
(1)vector:高效的随机访问,插入或删除元素较慢。
(2)list:在任何位置可以高效的插入或删除元素。
(3)queue:高效的随机访问,从两端可以高效的插入和删除元素,在首部或尾部插入元素,不会使任何迭代器失效;而在首部或尾部删除元素,则会使指向被删除元素的迭代器失效。在queue任何其他位置插入或删除元素将使指向该容器所有元素的迭代器都失效。
二、关联容器:map,set
1.map容器的常见用法:
map定义的类型:键值对的形式存储
map<K,V>::key_type:在 map 容器中,用做索引的键的类型 |
map<K,V>::mapped_type:在 map 容器中,键所关联的值的类型 |
map<K,V>::value_type:一个 pair 类型,它的 first 元素具有const map<K, V>::key_type 类型,而 second 元素则为 map<K, V>::mapped_type 类型 |
(1)声明
map<string,string> mp1;
(2)插入元素:
下标法:
mp1["Tom"] = "dsjfkjf";
**注意:使用下标法时,若map中不存在,则直接插入该键,并添加默认类型的值。
insert:mp1.insert(map<string,string>::value_type("Joeey","dsjf"));
(3)访问元素:
下标法:
string value1 = mp1["Tom"];
**注意:使用下标法访问元素时,如果该键不在 map 容器中,那 么下标操作会插入一个具有该键的新元素。
使用count函数:
mp1.count("Tom");返回“Tom”出现的次数
使用find函数:
mp1.find("Tom");如果 map 容器中存在按 "Tom" 索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器。
(4)迭代遍历元素:
// get iterator positioned on the first element
map<string, int>::const_iterator
map_it = word_count.begin();
// for each element in the map
while (map_it != word_count.end()) {
// print the element key, value pairs
cout << map_it->first << " occurs "
<< map_it->second << " times" << endl;
++map_it; // increment iterator to denote the next element
}
(5)删除元素:
m.erase(k):删除 m 中键为 k 的元素。返回 size_type 类型的值,表示删除 的元素个数 |
m.erase(p):从 m 中删除迭代器 p 所指向的元素。p 必须指向 m 中确实存在 的元素,而且不能等于 m.end()。返回 void |
m.erase(b,e):从 m 中删除一段范围内的元素,该范围由迭代器对 b 和 e 标记。 b 和 e 必须标记 m 中的一段有效范围:即 b 和 e 都必须指向 m 中的元素或最后一个元素的下一个位置。而且,b 和 e 要么相等 (此时删除的范围为空),要么 b 所指向的元素必须出现在 e 所 指向的元素之前。返回 void 类型 |
2.set:只能存储键
set 容器的每个键都只能对应一个元素,不提供下标操作符。
正如不能修改 map 中元素的键部分一样,set 中的键也为 const。
(1)在 set 中添加元素:可使用 insert 操作。
set<string> set1;
set1.insert("the");
(2)从 set 中获取元素:为了通过键从 set 中获取元素,可使用 find 运算。如果只需简单地判断某个元素是否存在,同样可以使用 count 运算,返 回 set 中该键对应的元素个数。当然,对于 set 容器,count 的返回值只能是 1(该元素存在)或 0(该元素不存在)。