码迷,mamicode.com
首页 > 编程语言 > 详细

C++的容器简介

时间:2017-10-03 10:37:11      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:display   imap   基于   cout   ast   而且   简介   unique   分享   

容器,就是存放数据的地方。

C++的STL(模版库)有两种容器:顺序容器和关联容器。简单来说,顺序容器就是将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素。而关联容器则是通过键(key)存储和读取元素

标准容器类 说明
顺序性容器
vector 从后面快速的插入与删除,直接访问任何元素
deque 从前面或后面快速的插入与删除,直接访问任何元素
list 双链表,从任何地方快速插入与删除
关联容器
set 快速查找,不允许重复值
multiset 快速查找,允许重复值
map 一对多映射,基于关键字快速查找,不允许重复值
multimap 一对多映射,基于关键字快速查找,允许重复值
容器适配器
stack 后进先出
queue 先进先出
priority_queue 最高优先级元素总是第一个出列

所有标准库共有函数

默认构造函数 提供容器默认初始化的构造函数。
复制构造函数 将容器初始化为现有同类容器副本的构造函数
析构函数 不再需要容器时进行内存整理的析构函数
empty 容器中没有元素时返回true,否则返回false
max_size 返回容器中最大元素个数
size 返回容器中当前元素个数
operator= 将一个容器赋给另一个容器
operator< 如果第一个容器小于第二个容器,返回true,否则返回false,
operator<= 如果第一个容器小于或等于第二个容器,返回true,否则返回false
operator> 如果第一个容器大于第二个容器,返回true,否则返回false
operator>= 如果第一个容器大于或等于第二个容器,返回true,否则返回false
operator== 如果第一个容器等于第二个容器,返回true,否则返回false
operator!= 如果第一个容器不等于第二个容器,返回true,否则返回false
swap 交换两个容器的元素

其中operator>,operator>=,operator<,operator<=,operator==,operator!=均不适用于priority_queue

顺序容器和关联容器共有函数

 

begin 该函数两个版本返回iterator或const_iterator,引用容器第一个元素
end 该函数两个版本返回iterator或const_iterator,引用容器最后一个元素后面一位
rbegin 该函数两个版本返回reverse_iterator或const_reverse_iterator,引用容器最后一个元素
rend 该函数两个版本返回reverse_iterator或const_reverse_iterator,引用容器第一个元素前面一位
erase 从容器中清除一个或几个元素
clear 清除容器中所有元素

①ector

最常用的容器,最初设计是为了替代C语言中的数组,可以自动扩容(初学时候我还一直吐槽为什么不支持VLA……),支持随机存储,在尾端添加元素为O(1),中间为O(n)。但是问题也很大,本身存放数据方式就是数组,在size不够时候需要把数据复制到更大的地方。

具体操作方法wiki有具体写:https://zh.wikipedia.org/wiki/Vector_(STL)

②List

列表,实现方法是单链表,在任意部位插入删除的时间复杂度都为O(n),尾部O(1),但是不支持随机访问,而且因为每个元素还需要存储后指针,所以内存开销比vector大了不少。

详阅:https://zh.wikibooks.org/wiki/C%2B%2B/STL/forward_list

deque

列表和数组的结合,支持随机访问,删除插入都为O(n),两端为O(1)(push pop),但是存储了前后指针,内存开销更大了。

详阅:https://zh.wikibooks.org/wiki/C%2B%2B/STL/Deque

 map、set、multimap、multiset

通过键值存储,可以按照键值排序,查找复杂度为O(logn)

map and multimap are associative containers that manage key/value pairs as elements as seen above. The elements of each container will sort automatically using the actual key for sorting criterion. The difference between the two is that maps do not allow duplicates, whereas, multimaps does.

  • map - unique keys
  • multimap - same key can be used many times
  • set - unique key is the value
  • multiset - key is the value, same key can be used many times

map和multimap代码实例:

技术分享
/* Map example - character distribution  */
  #include <iostream>
  #include <map>
  #include <string>
  #include <cctype>
 
  using namespace std;
 
  int main()
  {
          /* Character counts are stored in a map, so that 
           * character is the key.
           * Count of char a is chars[‘a‘]. */
          map<char, long> chars;
 
          cout << "chardist - Count character distributions" << endl;
          cout << "Type some text. Press ctrl-D to quit." << endl;
          char c;
          while (cin.get(c)) {
                  // Upper A and lower a are considered the same 
                  c=tolower(static_cast<unsigned char>(c));
                  chars[c]=chars[c]+1; // Could be written as ++chars[c];
          }
 
          cout << "Character distribution: " << endl;
            
          string alphabet("abcdefghijklmnopqrstuvwxyz");
          for (string::iterator letter_index=alphabet.begin(); letter_index != alphabet.end(); letter_index++) {
                  if (chars[*letter_index] != 0) {
                          cout << char(toupper(*letter_index))
                               << ":" << chars[*letter_index]
                               << "\t" << endl; 
                  }
          }
          return 0;
  }
View Code

 

参考

STL十大容器, just_kong, http://www.aiuxian.com/article/p-2119514.html

C++ Programming/STL, https://en.wikibooks.org/wiki/C%2B%2B_Programming/STL#Containers

C++的容器简介

标签:display   imap   基于   cout   ast   而且   简介   unique   分享   

原文地址:http://www.cnblogs.com/himself65/p/7623271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!