关联容器
associative-container
与正常数组不同,像是个字典,索引,通过一个key-value找到对应的值
C++提供了8种容器
-map 保存关键字和值
-set 只保存关键字的容器
-multimap 可重复的map
-multiset 可重复的set
无序集合,加个关键字就行,例如 unordered_map 他说用哈希函数组织的
ps 数组下标类型是size_t
map统计单词输入次数
map<string, size_t> word_count;
string word;
while (cin >> word)
++word_count[word];
for (const auto &w : word_count)
cout << w.first << " occurs " << w.second << ((w.second > 1) ? "times" : "time") << endl;
win下是Ctrl+Z结束输入,按了半天Ctrl+D。。。XD
##set 筛选词汇
map<string, size_t>word_count;
set<string> exclude = { "The","But","And","A","Or"
"the","but","and","a","or" };
string word;
while (cin >> word)
if (exclude.find(word) == exclude.end())
++word_count[word];
for (const auto &w : word_count)
cout << w.first << " is " << w.second << endl;
关联容器虽然普通容器的操作,但是不支持push_front
::key_type set的key,map的key
::mapped_type map的value
::value_type set的key,map的pair
se的insert对于已存在的元素无影响
word_count.erase //delete
word_count.at(k) //访问k的元素,不存在的话,抛出异常
word_count[k] //返回k元素,不在的话,添加一个k进行初始化
vector
通常vector是最好的容器选择,支持快速随机访问,但插入较慢
vector<int> vec(10);
vec[5]=5; //数组式的赋值
vec.push_back(num) //队尾添加
vec.pop_back //删除队尾
vec.empty() //是否为空
vec.at(pos) //得到编号处的数据
vec.reserve(50) //改变空间大小
vec.begin() //返回一个迭代器,它指向容器的第一个元素
vec.end() //返回一个迭代器,它指向容器的最后一个元素的下一个位置
vec.rbegin() //返回一个逆序迭代器,它指向容器的最后一个元素
vec.rend(); //返回一个逆序迭代器,它指向容器的第一个元素前面的位置
vec.erase(pos) //删除pos位置数据
vec.erase(beg,end) //删除区间
vec.insert(pos,num) //pos位插入
swap(vec1,vec2) //交换,容量也会交换
//iterator & reverse_iterator
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it ;
}