STL顺序容器【vector】【deque】【list】

我们都知道,stl容器中将容器分为两类,顺序容器和关联容器。

顺序容器有三种即vector,deque,以及list

一:顺序容器的常用操作

1:首先顺序容器的迭代器

定义:T<C>::iterator iter;

/*支持所有顺序容器*/

*iter返回迭代器的引用

iter->mem 对iter解引用,等效于(*iter).men

++iter|iter++自加

--iter|iter--自减

iter1==iter2  |  iter1!=iter2比较

/*只支持vector 和deque*/

iter+n |  iter-n迭代器加减整数值

iter1+=iter2 | iter1-=iter2迭代器复合运算

iter1-iter2迭代器减法

>,>=,<,<=迭代器关系符!!也可用于迭代器间比较大小

2:迭代器范围

c.begin() | c.rend()指容器中第一个元素,后面是逆序迭代器

c.end()  | c.rbegin() 指容器最后一个元素

c.size()返回容器元素个数

c.max_size()返回最多容纳元素个数

c.empty()是否为空,返回布尔值

c.resize(n)调整容器长度大小,使其能够容纳n个元素

c.resize(n,t)容纳n个元素,新添加的都是t

c.capacity()获取当前容器的能够存储的元素总数

c.reverse(n)为容器预留多少空间

3:容器定义的类型别名

size_type无符号整形,容器长度

iterator迭代器类型

const_iterator 只读迭代器类型

reverse_iterator逆序寻址迭代器

const_reverse_iterator只读逆序寻址迭代器

difference_type迭代器差值,可为负值

value_type元素类型

reference元素左值类型

const_reference常量元素左值类型

/*定义方法 C<T>::类型别名 变量;

4:容器的初始化

C<T> c;  创建空容器

C<T> c(c2); 创建容器是从c2的副本

C<T> c(b,e);创建容器是迭代器b到e的副本

C<T> c(n,t);创建由n个t元素初始化

C<T> c(n);
创建由n个初始化的容器

5:添加及删除元素

c.push_back()尾部添加元素

c.push_front()首部添加元素,不适用与vector

c.insert(p,t)迭代器p位置添加t

c.insert(p,n,t)迭代器p位置添加n个t

c.insert(p,b,e)迭代器p位置更新为某段迭代器b到e中的元素

删除元素

c.erase(p)删除迭代器p位置的元素

c.erase(b,e)删除迭代器b到e范围内的元素

c.clear()清空所有元素

c.pop_back()删除容器最后一个元素

c.pop_front()删除第一个元素,不适用于vector

6:访问容器元素

c.back()返回容器最后一个元素引用

c.front()返回第一个元素引用

c[i] | c.at(i)返回第i个元素引用,不适用于list

7:赋值与swap

c1=c2c1赋值为c2,删除c1中元素,复制c2到c1

c1.swap(c2)交换c1与c2中的元素

c.assign(b,e)用迭代器b到e的元素更新全部的c

c.assign(n,t)c中更新为n个t

二:顺序容器间的区别及容器的选用

1:vector和deque能够随机的访问元素,vector和deque对操作符“ [] ”重载了,而list没有,我们我们只能通过迭代器访问,而不能通过下标访问。

2:在中间位置插入元素次数较多是优先选择list,如果在首部和尾部插入较多是优先选择deque。

3:编程中容器可以交叉是用以提高效率,如果只是在读取的时候要在中间插入元素,而需要随机访问元素的话,我们可以用list读入,然后复制到vector中操作。

注意:我们知道vector是连续分配内存的,那么如果添加入新元素后这一块内存满了,那么vector必须找一块儿更大的内训,把当前的元素复制过去,然后释放之前的内存,这样的操作如果多次的话很浪费时间,解决办法是定义容器是就分配空间,适当多预留空间,那么久不会出现全部元素复制的情况。

练习代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <list>
using namespace std;
#define Del(a,b) memset(a,b,sizeof(a))
const int N = 11000;

int main()
{
    /*9.1.1*/
    vector<int> ievel;
    vector<string> svec;//(get_word_count("Chimera"));
    svec.push_back("i ccc");
    svec.push_back("yang can");
    svec.insert(svec.begin()+1,"momo");
    svec.insert(svec.begin()+1,5,"hahha");
    string s[10]={"what","is","your","name"};
    svec.insert(svec.begin()+1,s,s+4);
    vector<string>::iterator i=svec.begin();
    svec.erase(i+0);
    //svec.erase(i,i+2);
    for(int i=0;i<svec.size();i++)
        cout<<svec[i]<<endl;
    cout<<"---->"<<svec[10]<<endl;
    cout<<"xxxxx"<<svec.at(10)<<endl;  //另一种访问办法,下标超抛出out_of_range
    /*vector<string>::const_reverse_iterator ii;
    for(ii=svec.rbegin();ii!=svec.rend();ii--){
        cout<<*ii<endl;
    }*/
    /*list<string> slist(svec.begin(),svec.end());
    list<string>::iterator it;
    for(it=slist.begin();it!=slist.end();it++)
        cout<<*it<<endl;
    const list<int>::size_type ll=64;//注意类型
    list<string> ls(ll,"eh?");
    for(it=ls.begin();it!=ls.end();it++){}
        //cout<<*it<<endl;
    /*9.1.2
    vector<vector<string> > v;
    vector<string> s1;
    v.push_back(s1);*/
    list<int> lis(10,42);
    lis.resize(15); //调整容器大小
    lis.resize(25,-1); //可选参数初始值
    //lis.resize(5);
    list<int>::iterator it=lis.begin();
    for(;it!=lis.end();it++)
    {
        cout<<*it<<endl;
    }
    return 0;
}

STL顺序容器【vector】【deque】【list】

时间: 2024-10-10 19:25:37

STL顺序容器【vector】【deque】【list】的相关文章

STL 笔记(一): 顺序容器 vector、list、deque

STL 容器类 C++ STL 体现了泛型编程的思想,广义上分为: 容器 (Container),迭代器 (Iterator),算法 (Algorithm).容器类可以包含一组相同类型或不同类型的对象,包含相同类型对象时称为同类容器类,包含不同类型对象时,称为异类容器类.容器类库共包含 10 种容器,分为三类: 顺序容器:向量 (vector).双端队列 (deque).列表 (list); 关联容器:集合 (set).多重集合 (multiset).映射 (map)和多重映射 (multima

第十篇:顺序容器vector,deque,list的选用规则

前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(vector实现原型是顺序表,deque是双端队列,list是链表),因此这三种容器对插入删除以及访问操作的开销是不同的.为了编制出高效的程序,我们应当通过分析容器操作的开销来选择容器. 访问操作对容器选择的影响 1. vector容器的随机访问效率最高: 2. deque容器的随机访问效率也高: 3

C++ 顺序容器(vector,list、deque,stack,queue)

顺序容器的种类有:vector,list.deque 顺序容器适配器: stack     //先进后出   栈 queue   //先进先出   队列 priority_queue   //也优先管理级的优先队列 1.头文件 #include <vector> #include <list> #include <deque> //每一种头文件对应一种顺序容器 #include <queue> //队列 优先队列的头文件 #include <stack

STL顺序容器总结

顺序容器总结: array:固定大小的数组,支持快速访问,不能添加和删除元素 vector:动态数组,支持快速访问,但在尾部之外插入或删除元素会很慢 string:与vector相似的容器,用于保存字符 deque:双向队列,支持快速随机访问,在头尾位置插入元素速度很快 list:双向链表,支持双向访问,在链表任何位置插入和删除元素都很快 forward_list:单向链表,只支持单向访问,在链表任何位置插入和删除元素都很快 1.插入元素(除array外,因为array中数据是固定的): pus

stl 中List vector deque区别

stl提供了三个最基本的容器:vector,list,deque.         vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此     它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间     进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新     申请一块足够大的内存并进行内存的拷贝.这些都大大影响了vector的效率.         list就是数据结构中的双向链表(根据sgi   s

C++顺序容器vector、deque、list

1.容器元素类型 C++中大多数数据类型能够作为容器的元素类型.容器元素类型必须满足一下两个条件:支持赋值和复制操作. 所以没有元素是引用类型的容器,同一时候IO对象和auto_ptr也不能作为容器的元素类型. 2.vector容器的自增长 vector容器中存储的元素在内存中是连续存储的.假如容器中没有空间容纳新元素.此时因为元素必须连续存储以便索引訪问,所以不能在内存中随便找个地方存储这个新的元素,于是vector必须又一次分配空间.用于存放原来的元素和新加入的元素:存放在旧容器中的元素被拷

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. 插入的位置 头部插入:将所有元素后移,然后将新元素插入 中间插入:将插入点后面的元素后移,然

2.1顺序容器-vector

vector 1) *   :使用vector必须包含vector头文件.可变长的动态数组,支持随机访问,所有STL算法都可以对vector进行操作. ** :随机根据下标访问某个元素的时间是一个常数,尾部添加大多数情况下也是常数,中间插入和删除速度较慢. 2)成员函数 初始化 vector // 创建一个空的vector.vector c1(c2) // 复制一个vectorvector c(n) // 创建一个vector,含有n个数据,数据均已缺省构造产生vector c(n, elem)

STL里容器vector部分用法

基础用法在代码注释中说明 //test.cpp #include<iostream> #include<vector> using namespace std; int main() { vector<int> v; vector<int> v1(10);//为向量v1赋值10个0 vector<int> v3(10, 100);//为向量v3赋值10个100 for(int i=1; i<8; ++i) { v.push_back(i);