关联容器

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 ;
	}