C++关联容器

摘要:

关联容器中的元素是按关键字来保存和访问的。两个主要的关联容器:map,set。头文件map,set。

关联容器类型 描述
map
set
multimap
multiset
无序集合
unordered_map
unordered_set
unordered_multimap
unordered_multiset

1、简单的例子

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main()
{
    map<string,size_t> word_count;
    string word;
    while(cin >> word){
        ++word_count[word];
    }

    map<string,size_t>::iterator w;
    for(w = word_count.begin();w!= word_count.end();w++)
    {
        cout<<(*w).first<<"occurs<<(*w).second<<(((*w).second>1)? "times":"time")<<endl; } return 0; }
map<string,size_t> word_count;

string arr[] = {"hehe","haha","heihei"};
size_t size = sizeof(arr)/sizeof(string);
cout << size << endl;
set<string> words(arr,arr+size);

string word;
while(cin >> word){
    if(words.find(word) == words.end()){
        ++word_count[word];
        cout << word_count[word] <<endl;
    }
}

2、pair类型

定义在utility头文件中
一个pair保存两个数据成员。

pair<string,string> strstr;
//pair的默认构造函数对数据成员进行值初始化,因此strstr保存一个包含两个空string的pair
#include <utility>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    pair<int,int> pint(2,12);
    pair<string,string> pstr("Jack","Tom");

    cout<<pint.first<<pint.second<<endl;
    cout<<pstr.first<<pstr.second<<endl;
    return 0;
}

pair操作

#include <iostream>
#include <utility>
#include <string>

using namespace std;
int main()
{
    pair<int, string> p1, p2;
    p1 = make_pair(2, "Jack"); //
    p2.swap(p1);
    cout << "(" << p2.first << ", " << p2.second << ")\n";
}

3、关联容器操作

3.1、类型

类型 描述
key_type 关键字类型
value_type map->pair,set->key_ype
mapped_type 关键字关联的类型

3.2、关联容器迭代器

//map
map<string,int>mm;
pair<string,int>mp("yang",100);
mm.insert(mp);
map<string,int>::iterator miter;
miter = mm.begin();
string name = miter->first;
cout << name;
miter->first = "Yang"; //关键字是const类型,不能改变
cout << miter->first

对map而言first成员保存const关键字,second成员保存值

set的迭代器是const的

set<string>ms;
ms.insert("heihei");
cout << *ms.begin();

遍历关联容器

map<int,int>mmap;
map<int,int>::iterator miter = mmap.cbegin();
while(miter!=mmap.cend())
{
    cout<<miter->first<<miter->second<<endl;
    ++miter;    
}

关联容器和算法
我们通常不对关联容器使用泛型算法
例如泛型find会进行顺序搜索,比关联容器定义的专用find效率低。

3.3、添加元素

int arr[] = {1,2,3,4,5,6};
size_t size = sizeof(arr)/sizeof(int);
vector<int> vec(arr,arr+size);
set<int> mset;
mset.insert(vec.begin(),vec.end()); //

3.4、删除元素

c.erase();

3.5、map的下标操作
map提供了下标运算符,和at函数,而set不支持下标。
与其他的下标运算不同的时,如果关键字不再map中,会为它创建一个元素并插入到map中。
对map进行下标操作时,会返回mapped_type对象,但当解引用一个map迭代器时,会得到一个value_type对象。

3.6、访问元素
find(),count()

4、无序容器

无序容器管理操作 描述
桶接口
c.bucket_count() 正在使用的桶的个数
c.max_bucket_count() 容器能容纳的最多的桶的个数
c.bucket_size(n) 第n个桶有多少个元素
桶迭代
local_iterator 可以用来访问桶中元素的迭代器
const_local_iterator 桶迭代器的const版本
c.begin(n),c.end(n) 桶n的首元素迭代器和尾迭代器
c.cbegin(n),c.cend(n) const版
哈希策略
c.load_factor() 每个桶的平均元素数量,返回float值
c.max_load_factor() c试图维护的平均桶大小
c.rehash(n) 重组存储
c.reserve(n) 重组存储

你可能感兴趣的:(C++,关联容器)