zoukankan      html  css  js  c++  java
  • 关联容器

    前言

    关联容器并不值得写一篇讲解的文章,它只是部分细节需要熟能生巧。

    一、关键点

    向map、set中添加元素

    使用map、set

    关联容器的元素类型

    二、关联容器支持的类型别名

    类型别名 具体说明
    key_type 此容器类型的关键字类型
    mapped_type (只适用于map)每个关键字关联的类型
    value_type

    对于set,与key_type相同

    对于map,为pair<const key_type, mapped_type>

    其他类型别名参见顺序容器:iterator、size_type等

    使用示例:(我们使用作用域运算符来提取一个类型的成员)

    	set<string>::value_type v1;			//v1是一个string 
    	set<string>::key_type v2;			//v2是一个string 
    	map<string, int>::value_type v3;	//v3是一个pair<const string, int> 
    	map<string, int>::key_type v4;		//v4是一个string 
    	map<string, int>::mapped_type v5; 	//v5是一个int 

    三、使用map

    如单词计数程序是这么定义map的:map<string, size_t> wordCount;

    对于该map对象wordCount中的每个元素,关键字是string类型,值是size_t类型(在一个map中,元素是关键字-值对,即每个元素是一个pair对象)

    1. 初始化map

        map<string, string> family = { {"Dad", "Xinhong"},
                                                         {"Mom", "Meiyun"},
                                                         {"Son", "Liuyu"} };                        
    

    2. 使用迭代器打印map对象

    	map<string, size_t>::iterator map_it = wordCount.begin();
    	//解引用该迭代器时,我们会得到一个pair类型的引用 
    	cout << map_it->first << " " << map_it->second << endl; 
    

    3. 向map添加元素——使用insert成员

    • 之所以将这个点列入关键点,是因为插入一个已存在的元素对容器(特指map/set)没有任何影响,只有当元素的关键字不在容器中时才插入。

    对于一个map进行insert操作时,必须记住元素类型是pair,我们可以在insert的参数列表中创建一个pair:

    	wordCount.insert({word, 1});
    	wordCount.insert(make_pair(word, 1)); 
    	wordCount.insert(pair<string, size_t>(word, 1));
    	wordCount.insert(map<string, size_t>::value_type(word, 1));
    

    添加单一元素的insert版本返回一个pair,该pair的first成员是一个迭代器,second成员是一个指示插入是否成功的bool值:

    	//pair的first成员是一个map迭代器,指向wordCount中关键字为word的元素 
    	pair<map<string, size_t>::iterator, bool> ret = wordCount.insert(make_pair(word, 1));
    

    更多insert操作见附录。

    4. 从map删除元素

    对一个关联容器进行erase操作时,只要关注各个版本的返回类型:

    	auto cnt = wordCount.erase(word);	//从wordCount中删除每个关键字为word的元素,返回删除元素的数量
    	auto it = wordCount.erasr(p);		//从wordCount中删除迭代器p指定的元素,返回一个指向p之后元素的迭代器
    	auto it = wordCount.erase(b, e);	//删除迭代器对b和e所表示的范围中的元素,返回e 
    

    5. map的下标操作

    下标的类型为key_type,map下标运算符接受一个关键字,获取与此关键字相关联的值(如果有该关键字的元素存在的话)。

    如果关键字并不在map中,会为它创建一个元素并插入到map中,关联值将进行值初始化。

    四、使用set

    只保存关键字的容器,关键字的值是不能改变的

    1. 添加元素

    	vector<int> ivec = {2, 3, 5, 7, 11};
    	set<int> iset;
    	iset.insert(ivec.cbegin(), ivec.cend()); 
    	iset.insert({1, 2, 3, 4, 5});			//iset中元素为{1, 2, 3, 4, 5, 7, 11} 
    

    insert有两个版本:接受一对迭代器;接受一个初始化器列表

    返回类型同map

    2. 访问元素

    操作 说明
    c.find(k) 返回一个迭代器,指向第一个关键字为k的元素;若k不在容器中,则返回尾后迭代器
    c.count(k) 返回关键字等于k的元素的数量,不在则为0
    c.lower_bound(k) 返回一个迭代器,指向第一个关键字不小于k的元素
    c.upper_bound(k) 返回一个迭代器,指向第一个关键字大于k的元素
    c.equal_range(k) 返回一个迭代器pair,表示关键字等于k的元素的范围;若k不存在,pair的两个成员均等于c.end()

    附录

    1. 关联容器insert操作

    操作 说明

    c.insert(v)

    c.emplace(args)

    v是value_type类型的对象;args用来构造一个元素

    对于map和set,只有当元素的关键字不在c中时才插入(或构造)元素

    对于multimap和multiset,总会插入(或构造)给定元素

    c.insert(b, e)

    b和e是迭代器,表示一个c::value_type类型值的范围
    c.insert(il)  

    c.insert(p, v)

    c.emplace(p, args)

     

    2. pair类型

    3. 指定使用自定义的操作来组织一个关联容器中的元素

    multiset<Sales_data, decltype(compareIsbn)*> bookstore(compareIsbn);

     

  • 相关阅读:
    vue+elementUI表格排序事件
    移动端flex布局
    注册发送验证码提示信息
    jquery模拟生日日期下拉选择框
    标签模拟多选择框checkbox
    vue关于组件传值
    关于前端浏览器与服务器间的交互的对比与分析
    axios的基本使用
    Promise的基本使用
    Vue Cli2 文件路径别名
  • 原文地址:https://www.cnblogs.com/xzxl/p/7835272.html
Copyright © 2011-2022 走看看