Associative Containers

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到底有什么用,知道了再说吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值