c/c++ 标准库 map set 大锅炖

标准库 map set 大锅炖

一,关联容器有哪些

按关键字有序保存元素
map 保存key和value
set 只保存key
mulutimap key可以重复出现
multiset key可以重复出现
无序集合
unordered_map 用哈希函数做成的map
unordered_set 用哈希函数做成的set
unordered_mulutimap key可以重复出现
unordered_multiset key可以重复出现

二,关联容器的类型别名

类型别名 功能描述
key_type 关键字(key)的类型
value_type set的话,和key_type一样;map的话,是个pair
mapped_type 只适用于map,值(value)的类型
set<string>::value_type v1("aa");//v1是string类型
set<string>::key_type v2("bb");//v2是string类型
map<string, int >::value_type v3{"aa",12};//v3是pair<const string,int>类型
map<string, int>::key_type v4("cc");//v4是string类型
//只有map才有mapped_type
map<string, int>::mapped_type v5(100);//v5是int类型

三,关联容器的迭代器

当解一个关联容器的迭代器,会得到一个类型为容器的value_type的值的引用。

  • 解一个map的迭代器,得到的是pair,key是const的,不可以更改。
  • 解一个set的迭代器,得到的是key也是const的,不可以更改。
map<string, int> cnt{{"aa",1}, {"bb",2}};
auto map_it = cnt.begin();
//map_it->first = "new key";//错误,first为const
++map_it->second;
cout << map_it->second << endl;//2
set<int> iset{1,2,2,3,3,5};
set<int>::iterator set_it = iset.begin();
//*set_it = 10;//错误,不可以改变set的key

四,遍历关联容器

当使用迭代器遍历map,multimap,set,multiset时,迭代器按关键字升序遍历元素。

map<string, int> cnt{{"dd",1}, {"cc",2},{"aa", 10}};
auto map_it = cnt.cbegin();
while(map_it != cnt.cend()){
  cout << map_it->first << ":" << map_it->second << endl;
  ++map_it;
}
for(auto &s : cnt){
  cout << s.first << ":" << s.second << endl;
}

五,对关联容器使用泛型算法

  • 通常不对关联容器使用泛型算法,因为关联容器有key为const特性,很多算法不适用
  • 关联容器可用于只读算法,但是这些算法都需要搜索序列,比如find算法。但是关联容器有关键字,所以还莫不如用关联容器自己的find成员方法来的效率高。
  • 实际中,一般对关联容器,使用copy算法比较多
multiset<string> c{"aa","aa","dd","cc"};
vector<string> v{"ee","ff"};
//copy(v.begin(),v.end(), inserter(c, c.end()));//OK
//copy(v.begin(),v.end(), back_inserter(c));//NG,关联容器没有push_back
//copy(c.begin(),c.end(), inserter(v, v.end()));//OK,并且c的begin到end时拍好序的
copy(c.begin(),c.end(), back_inserter(v));//OK
for(auto &s : c){
  cout << s << " ";
}
cout << endl;
for(auto &s : v){
  cout << s << " ";
}
cout << endl;

小例子索引

代码块 功能描述
test1 关联容器的别名
test2 解关联容器的迭代器
test3 遍历关联容器
test4 对关联容器通用算法

小例子:

#include <iostream>
#include <map>
#include <set>
#include <vector>

using namespace std;

int main(){
  //test1 关联容器的别名
  /*
  set<string>::value_type v1("aa");//v1是string类型
  set<string>::key_type v2("bb");//v2是string类型
  map<string, int >::value_type v3{"aa",12};//v3是pair<const string,int>类型
  map<string, int>::key_type v4("cc");//v4是string类型
  //只有map才有mapped_type
  map<string, int>::mapped_type v5(100);//v5是int类型
  */

  //test2 解关联容器的迭代器
  /*
  map<string, int> cnt{{"aa",1}, {"bb",2}};
  auto map_it = cnt.begin();
  //map_it->first = "new key";//错误,first为const
  ++map_it->second;
  cout << map_it->second << endl;//2
  set<int> iset{1,2,2,3,3,5};
  set<int>::iterator set_it = iset.begin();
  //*set_it = 10;//错误,不可以改变set的key
  */

  //test3 遍历关联容器
  /*
  map<string, int> cnt{{"dd",1}, {"cc",2},{"aa", 10}};
  map<string, int>::const_iterator  map_it = cnt.cbegin();
  while(map_it != cnt.cend()){
    cout << map_it->first << ":" << map_it->second << endl;
    ++map_it;
  }
  for(auto &s : cnt){
    cout << s.first << ":" << s.second << endl;
  }
  auto it = cnt.begin();
  pair<string, int> p1 = *it;
  */

  //test4 关联容器的通用算法
  multiset<string> c{"aa","aa","dd","cc"};
  vector<string> v{"ee","ff"};
  //copy(v.begin(),v.end(), inserter(c, c.end()));//OK
  //copy(v.begin(),v.end(), back_inserter(c));//NG,关联容器没有push_back
  //copy(c.begin(),c.end(), inserter(v, v.end()));//OK,并且c的begin到end时拍好\序的
  copy(c.begin(),c.end(), back_inserter(v));
  for(auto &s : c){
    cout << s << " ";
  }
  cout << endl;
  for(auto &s : v){
    cout << s << " ";
  }
  cout << endl;
  return 0;
}

github完整代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9691584.html

时间: 2024-08-07 17:34:07

c/c++ 标准库 map set 大锅炖的相关文章

C++温习-标准库-map

关于map,也就是字典,kv键值对. 在C++中,它是一个类模板,它是属于一个关联容器类模板 template < class Key, // map::key_type class T, // map::mapped_type class Compare = less<Key>, // map::key_compare class Alloc = allocator<pair<const Key,T> > // map::allocator_type >

c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑

转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时候,如果容量不足,vector便会重新malloc一段更大的内存,然后把原内存中的数据memcpy到新的内存中,并free原内存块,然后将新元素加入.vector的元素插入性能跟以下几个要素关系重大: 1. 插入的位置 头部插入:将所有元素后移,然后将新元素插入 中间插入:将插入点后面的元素后移,然

C++温习-标准库-set

set,就是集合,其满足唯一性, C++中的标准库set是一个类模板, template < class T, // set::key_type/value_type class Compare = less<T>, // set::key_compare/value_compare class Alloc = allocator<T> // set::allocator_type > class set; 正常使用需要提供类别参数如 set<string>

标准库常用包介绍

标准库 https://godoc.org/-/go builtin 包 常量 true,false,iota 函数 len cap close(c chan Type) delete(map,key) make new panic recover 类型 int8 ~ int64 uint8(byte) ~ uint64 uint int  uintptr float32 float64 rune bool error string strings 包 函数 Contains  Index Sp

C++标准库和标准模板库

C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义. 在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括: (1)成本:已经作为标准提供,何苦再花费时间.人力重新开发呢: (2)质量:标准库的都是经过严格测试的,正确性有保证: (3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平: (4)良好的编程风格:采用行业中普遍的做法进行开发. 一.C++标准库 C++标准库的内容分为10类, 分别是:C1.语

程序设计语言-标准库概述

1 认识标准库 没有任何一个重要程序只用某种赤裸裸的程序设计语言写出的:首先总要开发出一组支持库,这也形成了进一步工作的基础. 2 第一个程序 #include<iostream>  //指编译器包含位于iostream里的标准流I/O功能的声明 int main() //定义一个main()函数,该函数没有参数,也不做任何事情 { std::cout<<"hello,world!\n"; //字符串文字量"hello,world!\n"将被

Python标准库13 循环器 (itertools)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在循环对象和函数对象中,我们了解了循环器(iterator)的功能.循环器是对象的容器,包含有多个对象.通过调用循环器的next()方法 (__next__()方法,在Python 3.x中),循环器将依次返回一个对象.直到所有的对象遍历穷尽,循环器将举出StopIteration错误. 在for i in iterator结构中,循环器每次返回的对象将赋予给i,直到循环结束.使

第32课 - 初探C++ 标准库

第32课 - 初探C++ 标准库 1. 有趣的重载 操作符 << 的原生意义是按位左移,例: 1  <<  2 ; 其意义是将整数 1 按位左移 2 位,即: 0000 0001   ->    0000 0100 重载左移操作符,将变量或常量左移到一个对象中! 1 #include <stdio.h> 2 3 const char endl = '\n'; 4 5 class Console 6 { 7 public: 8 Console& operat

C++ 标准库概览(一分钟就看完了)

C++ 标准库以若干头文件的方式提供. 下面简单介绍一个各头文件的内容. 第一部分 容器 Containers <array> C++11 新增.提供了容器类模板 std::array,固定大小数组的容器. <bitset> 提供了专门用来存放位组(一系列 bit)的容器类 std::bitset. <deque> 提供了双向队列容器类模板 std::deque. <forward_list> C++11 新增.提供了单向链表容器类模板 std::forwa