• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > c++中容器之总结篇

c++中容器之总结篇

作者:panmaoge 字体:[增加 减小] 来源:互联网 时间:2017-05-28

panmaoge 通过本文主要向大家介绍了c++map容器,c++ list容器,c++ set容器,c++ stl容器,c++容器等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C++中的容器大致可以分为两个大类:顺序容器和关联容器。顺序容器中有包含有顺序容器适配器。
顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素。主要有vector、list、deque(双端队列)。顺序容器适配器:stack、queue和priority_queue。
关联容器:支持通过键来高效地查找和读取元素。主要有:pair、set、map、multiset和multimap。
接下来依次对于各种容器做详细的介绍。

一、顺序容器

1、顺序容器定义
为了定义一个容器类型的对象,必须先包含相关的头文件:
      定义vector:#include <vector>
      定义list:#include <list>
      定义deque:#include <deque>

定义示例

vector<int> vi;
list<int> li;
deque<int> di;
</div>

2、顺序容器初始化

初始化示例:

//初始化为一个容器的副本
vector<int> vi;
vector<int> vi2(vi); //利用vi来初始化vi2
//初始化为一段元素的副本
char*words[] = {"stately", "plump", "buck", "mulligan"};
size_twords_size = sizeof(words)/sizeof(char*);
list<string> words2(words, words + words_size);
//分配和初始化指定数目的元素
constlist<int>::size_type list_size = 64;
list<string> slist(list_size, "a"); // 64 strings, each is a
</div>

3、顺序容器支持的指针运算

①所有顺序都支持的指针运行

②vector 和 deque 容器的迭代器提供额外的运算

③迭代器失效:一些容器操作会修改容器的内在状态或移动容器内的元素。这样的操作使所有指向被移动的元素的迭代器失效,也可能同时使其他迭代器失效。使用无效迭代器是没有定义的,可能会导致与悬垂指针相同的问题。

④begin和end成员:begin和end操作产生指向容器内第一个元素和最后一个元素的下一位置的迭代器。

3、顺序容器操作

①添加元素

添加元素示例:

//在容器首部或者尾部添加数据
list<int> ilist;
ilist.push_back(ix);//尾部添加
ilist.push_front(ix);//首部添加
//在容器中指定位置添加元素
list<string> lst;
list<string>::iterator iter = lst.begin();
while (cin >> word)
iter = lst.insert(iter, word); // 和push_front意义一样
//插入一段元素
list<string> slist;
string sarray[4] = {"quasi", "simba", "frollo", "scar"};
slist.insert(slist.end(), 10, "A");//尾部前添加十个元素都是A
list<string>::iterator slist_iter = slist.begin();
slist.insert(slist_iter, sarray+2, sarray+4);//指针范围添加
</div>

②容器大小的操作

示例:

list<int> ilist(10, 1);
ilist.resize(15); // 尾部添加五个元素,值都为0
ilist.resize(25, -1); // 再在尾部添加十个元素,元素为-1
ilist.resize(5); // 从尾部删除20个元素
</div>

③访问元素

int vector<int> vi;
for(int i=0;i<10;i++)vi.push_back(i);
cout<<vi[0]<<endl;
cout<<vi.at(0)<<endl;
cout<<vi[10]<<endl; //越界错误
cout<<vi.at(10)<<endl;//越界错误
</div>

④删除元素

示例:

//删除第一个或最后一个元素
list<int> li;
for(int i=0;i<10;i++)list.push_back(i);
li.pop_front();//删除第一个元素
li.pop_back(); //删除最后一个元素
//删除容器内的一个元素
list<int>::iterator iter =li.begin();
if(iter!= li.end())li.erase(iter);
//删除容器内所有元素
li.clear();
</div>

⑤赋值与swap

list<string> sl1,sl2;
for(int i=0;i<10;i++)sl2.push_back("a");
sl1.assign(sl2.begin(),sl2.end());//用sl2的指针范围赋值,sl1中十个元素都为a
sl1.assign(10, "A"); //s1被重新赋值,拥有十个元素,都为A
</div>

swap示例:

vector<string> vs1(3); // vs1有3个元素
vector<string> vs(5); // vs2有5个元素
vs1.swap(vs2);//执行后,vs1中5个元素,而vs2则存3个元素。

⑥vector的自增长:capacity 和 reserve 成员

为了提高vector的效率,不用每次添加元素都重新分配空间。vector会在分配空间时候预分配大于需要的空间。vector 类提供了两个成员函数:capacity 和reserve 使程序员可与 vector 容器内存分配的实现部分交互工作。
capacity操作:获取在容器需要分配更多的存储空间之前能够存储的元素总数
reserve操作:告诉vector容器应该预留多少个元素的存储空间

capacity(容量)与size(长度)的区别:size指容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。capacity是比size大的一般情况下。
示例:

vector<int> ivec;
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;//都为0
for (vector<int>::size_type ix = 0; ix != 24; ++ix)ivec.push_back(ix);
cout << "ivec: size: " << ivec.size()
<< " capacity: " << ivec.capacity() << endl;//capacity大于size
</div>

可以通过函数reserve()来操作预留空间

//在之前一段代码的基础上
ivec.reserve(ivec.capacity()+50);//为ivec增加了50的预留空间

另外:如果不手动操作来预留空间,每当 vector 容器不得不分配新的存储空间时,以加倍当前容量的分配策略实现重新分配。

4、容器的选用
选择容器类型的常规法则:
①如果程序要求随机访问元素,则应使用 vector 或 deque 容器。
②如果程序必须在容器的中间位置插入或删除元素,则应采用 list 容器。
③如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用 deque 容器。
④如果只需在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到一个 list 容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的 list 容器复制到一个 vector容器。
如果程序既需要随机访问又必须在容器的中间位置插入或删除元素,选择何种容器取决于下面两种操作付出的相对代价:随机访问 list 容器元素的代价,以及在 vector 或 deque 容器中插入/删除元素时复制元素的代价。通常来说,应用中占优势的操作(程序中更多使用的是访问操作还是插入/删

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • c++中容器之总结篇
  • C++利用容器查找重复列功能实现

相关文章

  • 2017-05-28C++可变参数的实现方法
  • 2017-05-28详解C语言中getgid()函数和getegid()函数的区别
  • 2017-05-28socket多人聊天程序C语言版(二)
  • 2017-05-28详解state状态模式及在C++设计模式编程中的使用实例
  • 2017-05-28用c语言实现冒泡排序,选择排序,快速排序
  • 2017-05-28VC++实现通过API来查看程序错误信息的方法
  • 2017-05-288皇后问题的解法实例代码
  • 2017-05-28C++中的explicit关键字实例浅析
  • 2017-05-28C++继承中的访问控制实例分析
  • 2017-05-28C++中可以接受任意多个参数的函数定义方法(详解)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • VC定时器的用法实例详解
    • 深入解析C++中的虚函数与多态
    • 用c语言实现冒泡排序,选择排序,快速排序
    • 深入理解C语言 static、extern与指针函数
    • 解析ActiveMQ的使用说明总结
    • 给ActiveX签名的实现方法详解
    • 数据结构顺序表操作示例
    • 浅析C和C++函数的相互引用
    • 关于C++静态成员函数访问非静态成员变量的问题
    • c++中拷贝构造函数的参数类型必须是引用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有