Associative Containers
map
multimap
set
multiset
1.map
关联数组,可以利用一个元素索引出另外一个
先来段代码
map<string, size_t> word_count; //新建一个map
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;
}
*本来word_count[word]并不存在,新建一个,然后将这个的value值置为1,如果存在直接+1
*在map中存储的是pair类型,定义在utility头文件中。
成员变量
key_type
mapped_type
value_type//这个是pair类型的
操作
增加
两种
insert
string word;
word-count.insert({word, 1});
word_count.insert(make_pair(word, 1));
word_count.insert(pair<string, size_t>(word, 1)); //推荐,前两个都需要c++11支持
word_count.insert(map<string, size_t>::value_type(word, 1));
返回值是pair类型 , first 是这个元素的iterator,second是bool类型,表示这个元素是否被正确插入。
[]
见第一个程序片段
删
erase()
这个方法有3个重载,参数分别是索引值,iterator和iterator的范围
参数是iterator, 返回值是iterator,被删元素的下一个。
参数是key_vaule, 返回值是size_type, 被删了几个。
取值
两种
[]
multimap无法取值,因为取出来的值不只有一个
可以用[]取值,但是这样不好,因为万一没有这个值,会自动新建一个,见代码1
find
if(word_count.find("foobar") == word_count.end())
cout << "foobar is not in the map" << endl;
2. set
一句话:就是个集合
先来段代码
// define a vector with 20 elements,
// holding two copies of each number from 0 to 9
vector<int> ivec;
for (vector<int>::size_type i = 0; i != 10; ++i) {
ivec.push_back(i);
ivec.push_back(i); // duplicate copies of each number
}
// iset holds unique elements from ivec; miset holds all 20 elements
set<int> iset(ivec.cbegin(), ivec.cend());
multiset<int> miset(ivec.cbegin(), ivec.cend());
cout << ivec.size() << endl; // prints 20
cout << iset.size() << endl; // prints 10
cout << miset.size() << endl; // prints 20
// returns an iterator that refers to the element with key == 1
iset.find(1);
iset.find(11); // returns the iterator == iset.end()
iset.count(1); // returns 1
iset.count(11); // returns 0
// returns an iterator to the first element with key == 1
iset.find(1);
iset.find(11); // returns the iterator == iset.end()
miset.count(1); // returns 2
miset.count(11); // returns 0
set<string> set1; // empty set
set1.insert("the"); // set1 now has one element
set1.insert("and"); // set1 now has two elements
#ifdef LIST_INIT
ivec = {2,4,6,8,2,4,6,8}; // ivec now has eight elements
set<int> set2; // empty set
set2.insert(ivec.cbegin(), ivec.cend()); // set2 has four elements
set2.insert({1,3,5,7,1,3,5,7}); // set2 now has eight elements
#else
set<int> set2; // empty set
int temp[] = {2,4,6,8,2,4,6,8};
set2.insert(begin(temp), end(temp));
int temp2[] = {1,3,5,7,1,3,5,7};
set2.insert(begin(temp2), end(temp2));
#endif
不知道set到底有什么用,知道了再说吧