STL容器的使用

1、在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。(连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销.

基本操作:

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;  记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;

(6)插入元素:    vec.insert(vec.begin()+i,a);  在第i+1个元素前面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);  删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);  删除区间[i,j-1];区间从0开始

(8)向量大小:  vec.size();

(9)清空:  vec.clear();

2、List容器,双向线性表list容器。(每个元素间用链表相连)访问随机元素不如vector快,随机的插入元素比vector快,对每个元素分配空间,所以不存在空间不够,重新分配的情况。

list类定义了双向的线性表。Vector类支持随机访问,但list只能支持顺序访问,由于list是双向的,因此我们可以按从前到后或者从后到前的顺序来访问list。

1.创建一个list对象

#include<list>
using namespace std;
     
list<int> lst1;
list<char> 
lst2;

2.向list对象中添加数值
从前面添加:

lst1.push_front(0);
lst1.push_front(1);

从后面添加:

lst1.push_back(0);   
lst1.push_back(1);

3.删除操作
删除list对象中的第一个元素

lst1.pop_front();

删除list对象中的最后一个元素

lst1.pop_back();

4.获得list对象的存储容量

lst1.size();

5.获得list对象中第一个和最后一个元素

list<int>::iterator p = lst1.begin();
list<int>::iterator p = lst1.end();

6.在list对象中插入元素

list<int>::iterator p = lst1.begin();
p++;
lst1.insert(p, 2 , 100);

7.在list对象中删除元素;

list<int>::iterator p1 = lst1.begin();
list<int>::iterator p2 = lst1.begin(); 
for (i=0;i<5;i++) p2++;lst1.erase(p1, p2);

8.访问list对象中的内容

list<int>::iterator p = lst1.begin();
while (p!=lst1.end())
{
     *p = *p + 100;
         p++;
}

9.将list对象中的内容排序;

lst1.sort();

(补充:

1list中的构造函数:

list() 声明一个空列表;

list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的

list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的

list(n,val) 声明一个和上面一样的列表

list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素

2 begin()和end():通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的 end() 函数来得到list末端下一位置,相当于:int a[n]中的第n+1个位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用。

3 push_back() 和push_front():使用list的成员函数push_back和push_front插入一个元素到list中。其中push_back()从list的末端插入,而 push_front()实现的从list的头部插入。

4 empty():利用empty() 判断list是否为空。

5 resize(): 如果调用resize(n)将list的长度改为只容纳n个元素,超出的元素将被删除,如果需要扩展那么调用默认构造函数T()将元素加到list末端。如果调用resize(n,val),则扩展元素要调用构造函数T(val)函数进行元素构造,其余部分相同。

6 clear(): 清空list中的所有元素。

7 front()和back(): 通过front()可以获得list容器中的头部元素,通过back()可以获得list容器的最后一个元素。但是有一点要注意,就是list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()函数判断list是否为空。

8 pop_back和pop_front():通过删除最后一个元素,通过pop_front()删除第一个元素;序列必须不为空,如果当list为空的时候调用pop_back()和pop_front()会使程序崩掉。

9 assign():具体和vector中的操作类似,也是有两种情况,第一种是:l1.assign(n,val)将 l1中元素变为n个T(val)。第二种情况是:l1.assign(l2.begin(),l2.end())将l2中的从l2.begin()到l2.end()之间的数值赋值给l1。

10 swap():交换两个链表(两个重载),一个是l1.swap(l2); 另外一个是swap(l1,l2),都可能完成连个链表的交换。

11 reverse():通过reverse()完成list的逆置。

12 merge():合并两个链表并使之默认升序(也可改),l1.merge(l2,greater<int>()); 调用结束后l2变为空,l1中元素包含原来l1 和 l2中的元素,并且排好序,升序。其实默认是升序,greater<int>()可以省略,另外greater<int>()是可以变的,也可以不按升序排列。)

3、

queue<int> q1;
queue<double> q2;

queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()

时间: 2024-10-11 04:35:50

STL容器的使用的相关文章

STL容器简介

C++标准定义了一系列的容器的共通要求,适用于所有的STL容器,然而由于C++11带来了容器的多样化,因此可能出现若干例外. ?初始化: 每个容器都提供了一个default构造函数,一个copy函数和一个析构函数 ? ? ?

STL容器之一vector

STL中最简单也是最有用的容器之一是vector<T>类模板,称为向量容器,是序列类型容器中的一种. 容器容量可以选择性修改.(1)声明:vector<type>  v;    //容量为0构造v对象,指定元素类型为typevector<type>  v(n);    //容量为n构造v对象,指定元素类型为typevector<type>  v(n, initValue);    //容量为n构造v对象,指定元素类型为type,且所有元素被初始化为initV

STL容器的遍历删除

STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的表项(当然这个函数是应该运行在另起一个线程上的),但是在按照下面的方法对hash_map(用迭代器)遍历删除时,当找到第一个满足删除条件的元素并将其删除后,程序将提示非法: for(list<int>::iterator iter = m_map.begin(); iter != m_map.en

STL 容器

标准库为相关对象的存储集合提供了各种类型安全容器.容器是类模板:在声明容器变量时,你可以指定该容器将保存的元素类型.可以使用初始值设定项列表构造容器.它们具有用于添加和移除元素以及执行其他操作的成员函数.可使用迭代器循环访问容器中的元素以及访问单个元素.可以通过使用其成员函数和运算符以及全局函数来显式使用迭代器.还可以隐式使用它们,例如通过使用范围 for 循环.所有 STL 容器的迭代器都有一个通用接口,但是每个容器会定义自己的专用迭代器. 容器可以分为三个类别:序列容器.关联容器和容器适配器

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map   list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest  

STL容器——对map排序

STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~ (还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列 的情况. Exam

C++ STL 容器之栈的使用

Stack 栈是种先进后出的容器,C++中使用STL容器Stack<T> 完美封装了栈的常用功能. 下面来个demo 学习下使用栈的使用. 1 //引入IO流头文件 2 #include<iostream> 3 //引入栈头文件 4 #include<stack> 5 using namespace std; 6 int main() 7 { 8 stack<int> st; 9 10 for (int i = 0; i < 10; i++) { 11

STL容器遍历时删除元素

STL容器遍历时在循环体内删除元素最容易出错了,根本原因都是因为迭代器有效性问题,在此记下通用删除方法,该方法适用于所有容器: 1 std::vector<int> myvec; 2 3 std::vector<int>::iterator it = myvec.begin(); 4 while( it != myvec.end()) 5 { 6 it = myvec.erase(it); 7 } 容器list有个比较另类的删除方法,如下代码所示: std::list<int

C++STL容器简析

标准STL序列容器:vector.string.deque和list.标准STL关联容器:set.multiset.map和multimap.非标准的关联容器hash_set.hase_multiset.hash_map和hash_multimap. (1)vector容器vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素.因此,

【C++】STL容器归纳总结(一)顺序容器

顺序容器: 顺序容器包括:vector.deque.list.forward_list.array以及string vector:可变大小数组,即将元素保存在一段连续的内存空间中.支持快速随机访问.在尾部之外的位置插入删除元素可能会很慢. PS:当元素已经占满了预先分配的内存空间,插入新的元素时,开辟一段新的内存空间,大小为之前vector的两倍,再将vector内的元素拷贝到新的内存空间内. vector的插入删除操作会造成迭代器的失效 list:双向链表.只支持双向顺序访问.在list任何位