STL常用容器归纳总结(2)

这篇主要讲一下顺序容器
1.vector(向量容器)

实现头文件:< vector>
定义方式:

1
2
3
4
vector<int> v1; //定义元素为int的向量v1
vector<int> v2(10); //指定向量v2的初始大小为10个int元素
vector<double> v3(10,1.23); //指定v3的10个初始元素的初值为1.23
vector<int> v4(a,a+5); //用数组a[0···4]共5个元素初始化v4

主要成员函数:

  • empty(): 判断当前向量是否为空。
  • size(): 返回当前向量容器中的实际元素个数。
  • [ ]: 返回指定下标的元素。
  • reserve(n): 为当前向量容器预分配n个元素的存储空间。
  • capacity(): 返回当前向量容器在重新进行内存分配以前所能容纳的元素个数。
  • resize(n): 调整当前向量容器的大小,使其能容纳n个元素。
  • push_back(): 在当前向量容器尾部添加一个元素。
  • insert(pos,elem): 在pos位置插入元素elem,即将元素elem插入到迭代器指定的元素之前。
  • front(): 获取当前向量容器的第一个元素。
  • back(): 获取当前向量容器的最后一个元素。
  • erase(): 删除当前向量容器中某个迭代器或者迭代器区间指定的元素。
  • clear(): 删除当前向量容器中的所有元素。
  • begin(): 该函数的两个版本返回iterator或const_iterator,引用容器的第一个元素。
  • end(): 该函数的两个版本返回返回iterator或const_iterator,引用容器的最后一个元素后面的一个位置。
  • rbegin(): 该函数的两个版本返回reverse_iterator或const_reverse_iterator,引用容器的最后一个元素。
  • rend(): 该函数的两个版本返回reverse_iterator或const_reverse_iterator,引用容器的第一个元素的前面一个位置。

最后两个是反向迭代。

演示代码:

#include<iostream>
#include< vector>
using namespace std;
int main(){
    vector<int> myv;         //定义vector容器myv
    vector<int>::iterator it;//定义myv的正向迭代器 it
    myv.push_back(1);         //在myv的末尾添加元素 1
    it = myv.begin();         //it迭代器指向开头元素 1
    myv.insert(it, 2);         //在it指向的元素之前插入元素 2
    myv.push_back(3);         //在myv的末尾添加元素 3
    myv.push_back(4);         //在myv的末尾添加元素 4
    it = myv.end();             //it 迭代器指向元素4的后面
    it--;                     //it 迭代器指向元素 4
    myv.erase(it);             //删除元素4
    for (it = myv.begin(); it != myv.end(); it++){
        cout << *it << " ";
    }
    return 0;
}
2.string(字符串容器)

实现头文件:< string>
定义方式:

1
2
3
4
5
6
char cstr[]="China! Greate Wall";	//C-字符串
string s1(cstr); // s1:China! Greate Wall
string s2(s1); // s2:China! Greate Wall
string s3(cstr,7,11); // s3:Greate Wall
string s4(cstr,6); // s4:China!
string s5(5,'A'); // s5:AAAAA

主要成员函数:

  • empty():判断当前字符串是否为空串
  • size():返回当前字符串的实际字符个数。
  • length():返回当前字符串的实际字符个数。
  • [idx]:返回当前字符串位于idx位置的字符,idx从0开始。
  • at(idx):返回当前字符串位于idx位置的字符。
  • compare(const string& str):返回当前字符串与字符串str的比较结果。在比较时,若两者相等,返回0;前者小于后者,返回-1;否则返回1。
  • append(cstr):在当前字符串的末尾添加一个字符串str。
  • insert(size_type idx,const string& str) :在当前字符串的idx处插入一个字符串str。
  • find(string &s,size_type pos):从当前字符串中的pos位置开始查找字符串s的第一个位置,,找到后返回其位置,若没有找到返回-1。
  • replace(size_type idx,size_type len,costring& str):将当前字符串中起始于idx的len个字符用一个字符串str替换。
  • substr(size_type idx,size_type len):返回当前字符串起始于idx的长度为len的字串。
  • clear():删除当前字符串中的所有字符。
  • erase():删除当前字符串中的所有字符。
  • erase(size_type idx):删除当前字符串从idx开始的所有字符。
  • erase(size_type idx,size_type len):删除当前字符串从idx开始的len个字符。
  • 迭代器函数:begin()、end()、rbegin()、rend()。

演示代码:

#include < iostream>
#include < string> 
using namespace std;
int main(){
    string s1 = "", s2, s3 = "Bye";
    s1.append("Good morning");         //s1=" Good morning"
    s2 = s1;                         //s1=" Good morning"
    int i = s2.find("morning");         //i=5
    s2.replace(i, s2.length() - i, s3);    //相当于s2.replace(5,7,s3)
    cout << "s1: " << s1 << endl;
    cout << "s2: " << s2 << endl;
    return 0;
}

输出:s1:Good morning s2:Good Bye

3.deque(双端队列)

实现头文件:< deque>
定义方式:

1
2
3
4
5
6
deque<int> dq1;	//定义元素为int的双端队列dq1
deque<int> dq2(10); //指定dq2的初始大小为10个int元素
deque<double> dq3(10,1.23);
//指定dq3的10个初始元素的初值为1.23
deque<int> dq4(dq2.begin(),dq2.end());
//用dq2的所有元素初始化dq4

主要成员函数:

  • empty():判断双端队列容器是否为空队。
  • size():返回双端队列容器中元素个数。
  • push_front(elem):在队头插入元素elem。
  • push_back(elem):在队尾插入元素elem。
  • pop_front():删除队头一个元素。
  • pop_back():删除队尾一个元素。
  • erase():从双端队列容器中删除一个或几个元素。
  • clear():删除双端队列容器中所有元素。
  • 迭代器函数:begin()、end()、rbegin()、rend()。

演示代码:

#include<iostream>
#include<cstdio>
#include <deque>
using namespace std;
void disp(deque<int> &dq)        //输出dq的所有元素
{ 
   deque<int>::iterator iter;        //定义迭代器iter
   for (iter=dq.begin();iter!=dq.end();iter++)
        printf("%d ",*iter);
   printf("\n");
}
int main()
{  
   deque<int> dq;            //建立一个双端队列dq
   dq.push_front(1);            //队头插入1
   dq.push_back(2);            //队尾插入2
   dq.push_front(3);            //队头插入3
   dq.push_back(4);            //队尾插入4
   printf("dq: "); disp(dq);
   dq.pop_front();            //删除队头元素
   dq.pop_back();            //删除队尾元素
   printf("dq: "); disp(dq);
   return 0;
}

输出:
dq:3 1 2 4
dq:1 2

4.list(链表容器)

实现头文件:< list>
定义方式:

1
2
3
4
list<int> l1;			//定义元素为int的链表l1
list<int> l2 (10); //指定链表l2的初始大小为10个int元素
list<double> l3 (10,1.23); //指定l3的10个初始元素的初值为1.23
list<int> l4(a,a+5); //用数组a[0..4]共5个元素初始化l4

主要成员函数:

  • empty():判断链表容器是否为空。
  • size():返回链表容器中实际元素个数。
  • push_back():在链表尾部插入元素。
  • pop_back():删除链表容器的最后一个元素。
  • remove ():删除链表容器中所有指定值的元素。
  • remove_if(cmp):删除链表容器中满足条件的元素。
  • erase():从链表容器中删除一个或几个元素。
  • unique():删除链表容器中相邻的重复元素。
  • clear():删除链表容器中所有的元素。
  • insert(pos,elem):在pos位置插入元素elem,即将元素elem插入到迭代器pos指定元素之前。
  • insert(pos,n,elem):在pos位置插入n个元素elem。
  • insert(pos,pos1,pos2):在迭代器pos处插入[pos1,pos2)的元素。
  • reverse():反转链表。
  • sort():对链表容器中的元素排序。
  • 迭代器函数:begin()、end()、rbegin()、rend()。

演示代码:

#include<iostream>
#include <list>
using namespace std;
void disp(list<int> &lst)        //输出lst的所有元素
{
    list<int>::iterator it;
    for (it = lst.begin(); it != lst.end(); it++)
        printf("%d ", *it);
    printf("\n");
}
int main()
{
    list<int> lst;            //定义list容器lst
    list<int>::iterator it, start, end;
    lst.push_back(5);            //添加5个整数5,2,4,1,3
    lst.push_back(2);  lst.push_back(4);
    lst.push_back(1);  lst.push_back(3);
    printf("初始lst: "); disp(lst);
    it = lst.begin();            //it指向首元素5
    start = ++lst.begin();        //start指向第2个元素2
    end = --lst.end();            //end指向尾元素3
    lst.insert(it, start, end);
    printf("执行lst.insert(it,start,end)\n");
    printf("插入后lst: "); disp(lst);
    return 0;
}

输出:
初始lst: 5 2 4 1 3
执行lst.insert(it,start,end)
插入后lst: 2 4 1 5 2 4 1 3

0%