这篇主要讲一下顺序容器
1.vector(向量容器)
实现头文件:< vector>
定义方式:1
2
3
4vector<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
6char 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
6deque<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
4list<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