文章目录

  • 容器的分类
  • 序列式容器(sequence containers)代码示例
    • 辅助函数
    • array 容器
      • array容器的测试代码
      • 测试代码中部分函数解析
    • vector 容器
      • vector 容器的测试代码
      • 测试代码中部分函数解析
    • list 容器
      • list 容器的测试代码
      • 测试代码中部分函数解析
    • forward_list 容器
    • deque 容器
      • stack 容器
      • queue 容器
  • 关联式容器(Associative Containers)代码示例
    • multiset 容器
      • multiset 容器测试代码
    • multimap 容器
      • multimap 容器测试代码
    • unordered_multiset 容器
      • unordered_multiset 容器测试代码
    • unordered_multimap 容器
    • set容器,map容器
    • unordered_set 容器
    • unordered_map 容器

容器的分类

  • 序列式容器(sequence containers)

    • Array

      • 连续空间,大小不能扩充
    • Vector
      • 连续空间,前面不可以扩充,后面可以扩充,
    • Deque
      • 连续空间,前后都可以扩充,
    • List
      • 双向链表,每一个元素带有两个指针,其占用内存比单向链表要多
    • Forward-List
      • 单向链表

  • 关联式容器(Associative Containers)(有key和value,适合做快速查找操作)

    • set/Multiset

      • set的key就是value,value就是key,set元素不能重复,Multiset元素可以重复
    • Map/Multimap
      • Map的每一个结点都有一个key和value,Map元素的key不能重复,Multimap元素的key可以重复
  • 不定序容器(Unordered Containers)(是关联式容器中的一种,底部结构是hashtable)

序列式容器(sequence containers)代码示例

辅助函数

//得到目标long
long get_a_target_long() {long target = 0;cout << "target (0~" << RAND_MAX << "):";cin >> target;return target;
}
//得到目标string
string get_a_target_string() {long target = 0;char buf[10];cout << "target (0~" << RAND_MAX << "):";cin >> target;//snprintf 将数值target转换成字符串snprintf(buf,10,"%d",target);return string(buf);
}
//比较两个long是否相等
int compareLongs(const void *a, const void *b) {return (*(long*)a- *(long*)b);
}
//比较两个string是否相等
int compareStrings(const void *a, const void *b) {if (*(string*)a > *(string*)b)return 1;else if (*(string*)a < *(string*)b)return -1;elsereturn 0;
}

array 容器

array<long,ASIZE> c;   array数组,第一个参数是容器中的类型,第二个参数是数组的大小。
array.size();   array的大小
array.front();  array的第一个元素
array.back();   array的最后一个元素
array.data();   array数组的首地址

array容器的测试代码

#include<iostream>
#include<array>
#include<ctime>
#include<cstdlib>//using namespace std;const int ASIZE = 50000;void test_array() {cout << "test_array() starting......" << endl;array<long, ASIZE> c ;clock_t timeStart = clock();for (long i = 0; i < ASIZE;++i) {c[i] = rand();}cout << "array数组中插入50000个元素所用时间:" << clock()- timeStart <<endl;cout << "array大小是:" << c.size() << endl;cout << "array中第一个元素是:" << c.front() << endl;cout << "array中最后一个元素是:" << c.back() << endl;cout << "array首地址是:" << c.data() << endl;//设定目标long值long target = get_a_target_long();timeStart = clock();qsort(c.data(),ASIZE,sizeof(long),compareLongs);long* pItem=(long*)bsearch(&target,c.data(), ASIZE, sizeof(long), compareLongs);cout << "qsort和bsearch所用时间:" << clock() - timeStart << endl;if (pItem != NULL)cout << *pItem << "在数组中,已找到!" << endl;elsecout << *pItem << "不在数组中!" << endl;
}
//调用test_array()
int main() {test_array();system("pause");return 0;
}

输出结果:

test_array() starting......
array数组中插入50000个元素所用时间:8
array大小是:50000
array中第一个元素是:41
array中最后一个元素是:14499
array首地址是:001CF028
target (0~32767):2000
qsort和bsearch所用时间:43
2000在数组中,已找到!

测试代码中部分函数解析

qsort和bsearch在cstdlib文件中
qsort(容器首地址,容器中元素数量,每一个元素的字节大小,排序方式)
bsearch(查询内容的地址,容器首地址,容器中元素数量,每一个元素的字节大小,排序方式)

vector 容器

vector容器的空间大小是两倍两倍的增长。其中两倍增长的意思是,当空间大小不够时,在另一块空间找到两倍大小的空间,将数据进行搬移到另一空间,而不是在原有空间的基础上进行增长。主要原因是因为vector空间连续。

vector<string> c;声明一个vector,第一参数是元素类型,第二参数是分配器,不写的话即是默认分配器vector.size() 是真正元素的个数
vector.capacity()是当前空间的大小
vector.push_back()是往vector里放数据以下功能同array:
vector.front()
vector.back()
vector.data()

vector 容器的测试代码

#include<vector>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<string>using namespace std;void test_vector(long& targets) {cout << "test_vector() starting......" << endl;vector<string> c;char buf[10];clock_t timeStart = clock();for (long i = 0; i < targets; ++i) {snprintf(buf, 10, "%d", rand());c.push_back(string(buf));}cout << "vector中插入50000个元素所用时间:" << clock() - timeStart << endl;cout << "vector大小是:" << c.size() << endl;cout << "vector容量是:" << c.capacity() << endl;cout << "vector中第一个元素是:" << c.front() << endl;cout << "vector中最后一个元素是:" << c.back() << endl;cout << "vector首地址是:" << c.data() << endl;//设定目标值string target = get_a_target_string();timeStart = clock();auto ite=find(c.begin(),c.end(),target);cout << "find所用时间:" << clock() - timeStart << endl;if (ite != c.end())cout << *ite << "在vector中,已找到!" << endl;elsecout << *ite << "不在vector中!" << endl;timeStart = clock();sort(c.begin(), c.end());string* pItem =   (string*)bsearch(&target,c.data(),c.size(),sizeof(string),compareStrings);cout << "sort+bsearch所用时间:" << clock()-timeStart<<endl;if (pItem != NULL)cout << *pItem << "在vector中,已找到!" << endl;elsecout << *pItem << "不在vector中!" << endl;
}
//调用test_vector函数
int main() {long targets = 50000;test_vector(targets);system("pause");return 0;
}

输出结果:

test_vector() starting......
vector中插入50000个元素所用时间:2047
vector大小是:50000
vector容量是:61447
vector中第一个元素是:41
vector中最后一个元素是:14499
vector首地址是:00970060
target (0~32767):1357
find所用时间:18
1357在vector中,已找到!
sort+bsearch所用时间:4094
1357在vector中,已找到!

测试代码中部分函数解析

首尾迭代器是前闭后开区间的形式

find(首迭代器,尾迭代器,搜寻的目标值)
sort(首迭代器,尾迭代器)
sort(首迭代器,尾迭代器,Compare comp) 其中,comp接受两个参数,返回bool值,comp是给出比较两个数的大小关系的方式

list 容器

list是每增加一个元素就增加一个对应大小的空间,其存储空间是不连续的。空间利用率高,但搜索数据慢。

 list<string>c;    声明一个list,第一参数是元素类型,第二参数是分配器list.size() 是真正元素的个数list.capacity()是当前空间的大小list.push_back()是往vector里放数据以下功能同array:list.front()list.back()list.data()

list 容器的测试代码

#include<list>
#include<algorithm>
#include<functional>
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<string>
using namespace std;void test_list(long& targets) {cout << "test_list() starting......" << endl;list<string> c;char buf[10];clock_t timeStart = clock();for (long i = 0; i < targets; ++i) {snprintf(buf, 10, "%d", rand());c.push_back(string(buf));}cout << "list中插入50000个元素所用时间:" << clock() - timeStart << endl;cout << "list大小是:" << c.size() << endl;cout << "list max_size大小是:" << c.max_size() << endl;cout << "list中第一个元素是:" << c.front() << endl;cout << "list中最后一个元素是:" << c.back() << endl;//设定目标值string target = get_a_target_string();timeStart = clock();auto ite = find(c.begin(), c.end(), target);cout << "find所用时间:" << clock() - timeStart << endl;if (ite != c.end())cout << *ite << "在list中,已找到!" << endl;elsecout << *ite << "不在list中!" << endl;timeStart = clock();c.sort();cout << "sort所用时间:" << clock() - timeStart << endl;}
//调用test_list函数
int main() {long targets = 50000;test_list(targets);system("pause");return 0;
}

输出结果

test_list() starting......
list中插入50000个元素所用时间:840
list大小是:50000
list max_size大小是:119304647
list中第一个元素是:41
list中最后一个元素是:14499
target (0~32767):1234
find所用时间:12
1234在list中,已找到!

测试代码中部分函数解析

list和 forward_list都有自己的sort函数
c.sort();是容器中的sort函数,不是标准库中的sort函数,当容器中有sort函数时,优先选择容器中的sort函数

forward_list 容器

forward_list<string>c; 声明一个forward_list
forward_list.push_front()   只有push_front()没有push_back(),即从beginning开始插入数据,比较快,从后面插入数据太慢,
forward_list.front()    首元素,没有forward_list.back(),没有forward_list.size()找forward_list里的元素,可用auto pItem=::find(c.begin(),c.end(),target),
::表示全局,即标准库中的find函数,返回的pItem是一个迭代器

deque 容器

双向开口,可进可出的连续性存储空间,但它是分段连续,
即在每一段中是连续的,段与段之间不连续,但在使用过程中,我们会觉得deque是整个连续的
当deque的空间不够用时,调用push_back时,会再分配一段空间使用deque<string>c; deque的声明
size(),front(),back(),max_size()函数意义同上找deque里的元素,可用auto pItem=::find(c.begin(),c.end(),target),deque自身没有sort函数,排序要用全局的sort,即  ::sort(c.begin(),c.end());


stack和queue容器没有新的技术,是使用deque得到的,一般不称为容器,而是称为容器适配器(container adapters)。stack和queue不提供迭代器相关操作,因为如果有迭代器相关操作的话,则stack和queue就可以改变其内部的数据,不再符合先进后出和先进先出的特性。

stack 容器

先进后出stack<string>c; stack的声明
size()
top()   返回最顶部数据,不弹出
pop()   最顶部元素弹出来
push()  元素放进去

queue 容器

先进先出queue<string>c; queue的声明
size()
front()
back()
pop()   元素弹出来
push()  元素放进去

关联式容器(Associative Containers)代码示例

multiset 容器

没有push_back,没有push_front
multiset<string>c;
multiset.insert()   插入元素
multiset.size()
multiset.max_size()搜寻某数据,multiset.find()比::find()快

multiset 容器测试代码

#include<set>
#include<algorithm>
#include<functional>
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<string>using namespace std;void test_multiset(long& targets) {cout << "test_multiset() starting......" << endl;multiset<string> c;char buf[10];clock_t timeStart = clock();for (long i = 0; i < targets; ++i) {snprintf(buf, 10, "%d", rand());c.insert(string(buf));}cout << "multiset中插入50000个元素所用时间:" << clock() - timeStart << endl;cout << "multiset大小是:" << c.size() << endl;cout << "multiset max_size大小是:" << c.max_size() << endl;//设定目标值string target = get_a_target_string();timeStart = clock();auto ite = find(c.begin(), c.end(), target);cout << "find所用时间:" << clock() - timeStart << endl;if (ite != c.end())cout << *ite << "在multiset中,已找到!" << endl;elsecout << *ite << "不在multiset中!" << endl;timeStart = clock();c.find(target);cout << "multiset容器中find所用时间:" << clock() - timeStart << endl;}
//调用test_multiset函数int main() {long targets = 50000;test_multiset(targets);system("pause");return 0;
}

输出结果,可以看出,容器自带的find函数快

test_multiset() starting......
multiset中插入50000个元素所用时间:2966
multiset大小是:50000
multiset max_size大小是:97612893
target (0~32767):88
find所用时间:62
88在multiset中,已找到!
multiset容器中sort所用时间:0

multimap 容器

multimap<long,string>c;    声明multimap
multimap.insert(pair<long,string>(i,buf));    插入key,value
multimap不可用[]做插入操作

multimap 容器测试代码

#include<map>
#include<algorithm>
#include<functional>
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<string>using namespace std;void test_multimap(long& targets) {cout << "test_multimap() starting......" << endl;multimap<long,string> c;char buf[10];clock_t timeStart = clock();for (long i = 0; i < targets; ++i) {snprintf(buf, 10, "%d", rand());c.insert(pair<long, string>(i,string(buf)));}cout << "multimap中插入50000个元素所用时间:" << clock() - timeStart << endl;cout << "multimap大小是:" << c.size() << endl;cout << "multimap max_size大小是:" << c.max_size() << endl;//设定目标long值long target = get_a_target_long();timeStart = clock();auto pItem=c.find(target);cout << "multimap容器中find所用时间:" << clock() - timeStart << endl;if (pItem != c.end())cout << "key为:" << pItem->first << " 在multimap中已找到,其value为:" << pItem->second << endl;elsecout << "key为:" << pItem->first << " 在multimap中不存在" << endl;}//调用test_multimap函数
int main() {long targets = 50000;test_multimap(targets);system("pause");return 0;
}

输出结果

test_multimap() starting......
multimap中插入50000个元素所用时间:2760
multimap大小是:50000
multimap max_size大小是:89478485
target (0~32767):30000
multimap容器中find所用时间:0
key为:30000 在multimap中已找到,其value为:8970

unordered_multiset 容器

unordered_multiset 容器底层结构是hashtable,multiset和multimap底层结构是红黑树

#include<unordered_set>
unordered_multiset<string> c;c.size()
c.max_size()
c.bucket_count();   bucket的个数
c.load_factor();    载重因子
c.max_load_factor();    最大载重因子为1
c.max_bucket_count();   最大bucket个数
c.bucket_size(i);

unordered_multiset 容器测试代码

#include<unordered_set>
#include<algorithm>
#include<functional>
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<string>using namespace std;void test_unordered_multiset(long& targets) {cout << "test_unordered_multiset() starting......" << endl;unordered_multiset<string> c;char buf[10];clock_t timeStart = clock();for (long i = 0; i < targets; ++i) {snprintf(buf, 10, "%d", rand());c.insert(string(buf));}cout << "unordered_multiset中插入50000个元素所用时间:" << clock() - timeStart << endl;cout << "unordered_multiset size是:" << c.size() << endl;cout << "unordered_multiset max_size大小是:" << c.max_size() << endl;cout << "unordered_multiset bucket_count()是:" << c.bucket_count() << endl;cout << "unordered_multiset load_factor()是:" << c.load_factor() << endl;cout << "unordered_multiset max_load_factor()是:" << c.max_load_factor() << endl;cout << "unordered_multiset max_bucket_count()是:" << c.max_bucket_count() << endl;for (int i = 0; i < 20;++i) {cout << "bucket # " << i << " has " << c.bucket_size(i) << " elements" << endl;}//设定目标值string target = get_a_target_string();timeStart = clock();auto ite = find(c.begin(), c.end(), target);cout << "find所用时间:" << clock() - timeStart << endl;if (ite != c.end())cout << *ite << "在unordered_multiset中,已找到!" << endl;elsecout << *ite << "不在unordered_multiset中!" << endl;timeStart = clock();c.find(target);cout << "unordered_multiset容器中find所用时间:" << clock() - timeStart << endl;}

输出结果

test_unordered_multiset() starting......
unordered_multiset中插入50000个元素所用时间:3668
unordered_multiset size是:50000
unordered_multiset max_size大小是:119304647
unordered_multiset bucket_count()是:65536
unordered_multiset load_factor()是:0.762939
unordered_multiset max_load_factor()是:1
unordered_multiset max_bucket_count()是:536870911
bucket # 0 has 0 elements
bucket # 1 has 0 elements
bucket # 2 has 2 elements
bucket # 3 has 0 elements
bucket # 4 has 8 elements
bucket # 5 has 2 elements
bucket # 6 has 0 elements
bucket # 7 has 0 elements
bucket # 8 has 0 elements
bucket # 9 has 0 elements
bucket # 10 has 0 elements
bucket # 11 has 0 elements
bucket # 12 has 0 elements
bucket # 13 has 0 elements
bucket # 14 has 0 elements
bucket # 15 has 0 elements
bucket # 16 has 0 elements
bucket # 17 has 0 elements
bucket # 18 has 0 elements
bucket # 19 has 0 elements
target (0~32767):1357
find所用时间:36
1357在unordered_multiset中,已找到!
unordered_multiset容器中find所用时间:0

unordered_multimap 容器

使用方法同multimap

set容器,map容器

使用方法同multiset,multimap,但是插入数据不重复
map可以用[]插入数据,例 map[key]=value;

unordered_set 容器

unordered_map 容器

底层结构是hashtable,用法同set和map

C++STL与泛型编程(3)容器之分类与测试相关推荐

  1. C++《STL和泛型编程》容器不带/带有成员函数总结

    容器不带成员函数count(): array  vector  list  forward_list  deque 容器带有成员函数count(): set/multiset  map/multima ...

  2. C++STL与泛型编程__侯捷视频_学习博客_总目录

    C++STL与泛型编程 侯捷 (1): c++重要网站相关 C++STL与泛型编程(2) 第一个C++ STL Application: STL六大部件代码示例,容器前闭后开区间,auto关键字的用法 ...

  3. C++ STL学习笔记(2) 容器结构与分类

    接着学习侯捷老师的C++ STL! 在使用容器的时候,需要明白容器中元素之间在内存里的关系是什么样的,是连续的,还是非连续的. 容器可以分为两类: 1. sequence container , 即序 ...

  4. C++中容器的分类以及相关用法

    C++中容器的分类以及相关用法 C++中的容器类型及使用 容器的分类 array 数组 vector 向量 list 列表 deque队列 关联容器 迭代器 C++中的容器类型及使用 容器的概念:   ...

  5. C++标准库(STL)与泛型编程

    C++标准库(STL)与泛型编程 学习网站: cplusplus.com cppRerference.com 学习书籍: <STL源码剖析> STL体系结构基础介绍 STL六大部件:容器. ...

  6. STL和泛型编程_学习笔记01

    STL和泛型编程 本学习笔记是基于侯捷老师的STl和泛型编程课程 1. STL六大部件基础介绍 (Components) ​ 容器(Containers) ​ 分配器(Allocator) ​ 算法( ...

  7. C++ STL和泛型编程(四)----movable

    C++ STL和泛型编程(四)----movable 一.moveable对各容器的影响 二.moveable class 三.测试函数 一.moveable对各容器的影响 其对vector的影响表现 ...

  8. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  9. C++STL的set/ multiset容器

    C++STL的set/ multiset容器 set基本概念 set大小和交换 set插入和删除 set查找和统计 set和multiset区别 pair对组创建 set容器排序 set基本概念 简介 ...

最新文章

  1. 继承和多态 1.0 -- 继承概念(is-a、has-a,赋值兼容规则,隐藏重定义)
  2. Ubuntu10.04制作官方源镜像以及搭建本地源
  3. 并发编程(十六)——java7 深入并发包 ConcurrentHashMap 源码解析
  4. CV2.imread得到的图像显示成蓝色的原因和3种BGR转RGB的方法
  5. SpringCloud观后感
  6. 生成word_用Word生成员工信息表,单独生成独立文件,还能自动命名
  7. java编程规范之java命名规范
  8. Oracle Update语句的几种方式
  9. atomic 原子量的使用心得
  10. 计算机内图片怎么自定义排序,win10系统设置图片文件自定义排序的图文教程
  11. win10无法调节屏幕亮度
  12. 微信windows版_安卓首发!微信黑暗模式来了
  13. E280-2G4T12S(SX1280)_STM21F1X驱动分享
  14. 《房债》书中的精髓:现代金融系统让全世界的人同处一艘经济大船上,一些人搞坏了船,所有的人都跟着遭殃。
  15. 导出到word时,报错,com组件错时,酱紫弄——————从同事那里抄滴
  16. MySQL数据库——基本操作
  17. An internal error occurred during: Fetching child
  18. C++实现gotoxy函数
  19. FlexboxLayout全攻略(Google官方灵活实现流式布局控件)
  20. 淘宝客推广的优势 推广作用提高销量、转化率、测图测款

热门文章

  1. linux解压tz zip,TZ 文件扩展名: 它是什么以及如何打开它?
  2. 累积分布函数_C7: 概率函数和分布函数Distribution Function
  3. AE点击按钮添加栅格
  4. 【转】RabbitMQ六种队列模式-1.简单队列模式
  5. sharepoint 2013 网站集解锁
  6. DB、ETL、DW、OLAP、DM、BI关系结构图
  7. mysql优化和索引_mysql优化和索引
  8. 外部依赖项很多未定义标识符_从日本编程书籍《我的第一本编程书》中译版看中文例程如何扬长避短——标识符(一)
  9. angular8实现对象数组根据某个属性排序(多个也可以)
  10. Python3 学习系列 丨 博客目录索引