当前位置:  编程技术>c/c++/嵌入式

c++ STL容器总结之:vertor与list的应用

    来源: 互联网  发布时间:2014-10-13

    本文导语:  STL提供六大组件,彼此可以组合套用 1、容器(containers):各种数据结构,如vertor,list,deque,set,map.从实现的角度来看,STL容器是一种class template 2、算法(algorithms):各种算法如sort,search,copy,earse。STL算法是一种 function...

STL提供六大组件,彼此可以组合套用

1、容器(containers):各种数据结构,如vertor,list,deque,set,map.从实现的角度来看,STL容器是一种class template

2、算法(algorithms):各种算法如sort,search,copy,earse。STL算法是一种 function template。

3、迭代器(iterators):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。所有STL容器都有自己的专属的迭代器。

4、仿函数(functors):行为类似函数,可以作为算法的某些策略。从实现的角度来看,仿函数是一种重载了operator()的class或class template。

5、配接器(adapters):一种用来修饰容器或仿函数或迭代器借口的东西。例如queue和stack

6、配置器(allocators):负责空间的配置与管理。配置器是一个实现了动态空间分配、空间管理、空间释放的class template。

STL是建立在泛化之上的。数组泛化为容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所用的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。

vector、string、deque和list被称为标准序列容器,

set、multiset、map和multimap是标准关联容器。

非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串。

非标准关联容器hash_set、hash_multiset、hash_map和hash_multimap。

标准非STL容器,包括数组、bitset、valarray、stack、queue和priority_queue。

迭代器被分成五个种类:

输入迭代器是每个迭代位置只能被读一次的只读迭代器。

输出迭代器是每个迭代位置只能被写一次的只写迭代器。

输入和输出迭代器被塑造为读和写输入和输出流(例如,文件)。

前向迭代器有输入和输出迭代器的能力,但是它们可以反复读或写一个位置。

双向迭代器就像前向迭代器,除了它们的后退可以像前进一样容易。标准关联容器都提供双向迭代器。list也有。

连续内存容器(也叫做基于数组的容器)在一个或多个(动态分配)的内存块中保存它们的元素。如果一个新元素被查入或者已存元素被删除,其他在同一个内存块的元素就必须向上或者向下移动来为新元素提供空间或者填充原来被删除的元素所占的空间。这种移动影响了效率和异常安全。标准的连续内存容器是vector、string和deque。非标准的rope也是连续内存容器。

基于节点的容器在每个内存块(动态分配)中只保存一个元素。容器元素的插入或删除只影响指向节点的指针,而不是节点自己的内容。所以当有东西插入或删除时,元素值不需要移动。表现为链表的容器——比如list和slist——是基于节点的,所有的标准关联容器也是(它们的典型实现是平衡树)。非标准的散列容器使用不同的基于节点的实现。

1、vector

vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取(即使用[]操作符访问其中的元素),但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝(复杂度是O(n)),另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。

vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector类型的每一种都指定了其保存元素的类型。因此,vector和vector 都是数据类型。

 

vector对象的定义和初始化

vector  v1;

vector保存类型为T的对象。默认构造函数v1为空。

vector v2(v1);

v2是v1的一个副本。

vector v3(n, i);

v3包含n个值为i的元素。



vector ivec4(10, -1);     // 10 elements, each initialized to -1

vector svec(10, "hi!"); // 10 strings, each initialized to "hi!"

vector的操作

v.empty()

如果v为空,则返回true,否则返回false。

v.size()

返回v中元素的个数。

v.push_back(t)

在v的末尾增加一个值为t的元素。

v[n]

返回v中位置为n的元素。

v1 = v2

把v1的元素替换为v2中元素的副本。

v1 == v2

如果v1与v2相等,则返回true。

!=, =

保持这些操作符惯有的含义。

向vector添加元素:

代码如下:

string word;

vector text;        // empty vector

while (cin >> word) {

    text.push_back(word);  // append word to text

}
  vector的下标操作:


for (vector::size_type ix = 0; ix != ivec.size(); ++ix)

    ivec[ix] = 0;

vector迭代器

每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,由begin返回的迭代器指向第一个元素:

代码如下:

vector::iterator iter = ivec.begin();

由end操作返回的迭代器指向vector的“末端元素的下一个”。通常称为超出末端迭代器(off-the-end iterator),表明它指向了一个不存在的元素。如果vector为空,begin返回的迭代器与end返回的迭代器相同。
代码如下:

for (vector::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)

    *iter = 0;  // set element to which iter refers to 0

const_iterator

前面的程序用vector::iterator改变vector中的元素值。每种容器类型还定义了一种名为const_iterator的类型,该类型只能访问容器内元素,但不能改变其值。

代码如下:

for (vector::const_iterator iter = text.begin();  iter != text.end(); ++ iter)

    *iter = " ";     // error: *iter is const

2、list

list是由数据结构中的双向链表实现的,因此它的内存空间可以是不连续的。因此只能通过指针来进行数据的访问,这个特点使得它的随机存取变的非常没有效率,需要遍历中间的元素,搜索复杂度O(n),因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。

list::iterator与vector::iterator的一些不同:

代码如下:

#include
#include
#include
using namespace std;

int main( void )
{
        vector v; 
        list l;

        for (int i=0; i

    
 
 

您可能感兴趣的文章:

  • C++ STL Bitsets构造函数及成员函数解释及代码示例
  • 是不是只有C++才可以使用STL?
  • c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
  • 哪儿能下载aix4.3的c++ stl库
  • 网络技术 iis7站长之家
  • 各位,请问怎样在linux下使用gnu c++库和stl库,请具体一点,谢谢(可开更多帖给分)!
  • C++ STL标准模板库类String成员详细列表参考及示例代码
  • 用gcc怎样编译STL的c++程序?
  • C++ stl队列Queue用法介绍:删除,插入等操作代码举例
  • C++在成员函数中使用STL的find_if函数实例
  • c++ stl栈容器stack的pop(),push()等用法介绍及头文件
  • 深入解析C++ STL中的常用容器
  • C++ STL库中priority_queue介绍,成员函数说明及priority_queue具体用法举例
  • C++ 关于STL中sort()对struct排序的方法
  • c++ stl multimap基本操作使用技巧详细介绍
  • c++非变易算法-stl算法
  • c++ STL关联式容器Map成员函数介绍及查找(find()),插入(insert()),删除(erase())等操作代码举例
  • 双向队列Deque 类成员函数列表参考(c++ STL 容器)
  • c++ STL List查找遍历及各成员函数用法详细介绍
  • C++ STL MultiSet类成员函数介绍及具体用法示例
  • 请问STL中的所有容器(map,multimap,list,queue,vector,set,multiset.......)在BOOST中都可以找到么
  • STL各个容器性能详细比较
  • 过河小兵,求救各位大哥,我想把stl中的map,vector等容器,做成内存共享方式,希望大哥大姐们指点一下
  • 浅析stl序列容器(map和set)的仿函数排序
  • stl容器set,map,vector之erase用法与返回值详细解析
  • STL常用容器详细解析
  • 关于STL中list容器的一些总结
  • 关于STL中的map容器的一些总结
  • 关于STL中set容器的一些总结
  • 关于STL中vector容器的一些总结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • STL vector+sort排序和multiset/multimap排序比较
  • SGI的STL库 SGI STL
  • 在UNIX中可以包含STL算法吗?
  • linux完全支持C++STL嗎?
  • STL 在 UNIX 多线程 中不能用?
  • Linux系统下如何获取STL帮助
  • STL实现 EASTL
  • 在COMPAQ TRUE64 UNIX用C++编程,使用Gcc,支不支持stl?
  • 请问在linux下面编程怎样查询stl类的成员函数
  • 关于stl源代码
  • 请问如果要同时使用STL和多线程,会很麻烦么
  • linux下用c语言写的程序,其中可以使用STL模板吗?先谢谢各位
  • 如果是系统里同时存在两个不同的STL库的话会怎样?
  • STL既然是用头文件实现的,为何还需要链接-lstd?
  • uclinux上如何使用标准模板库STL?
  • STL 标准模板库 uSTL
  • 使用stl时需要什么特别配置吗?
  • 请教一个STL的使用的问题
  • linux下gcc 的stl支持,需要安装哪个库呢?
  • 我想把STL中的vector,map,set,multimap,multiset的所有操作修改成线程安全的,可以么
  • STL能否用在C中?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3