C++ STL 容器(2)

一 STL的string
1 概念:
(1)string是STL的字符串类型,通常用来表示字符串.
(2)string和char*的比较:(a)string是一个类, char*是一个指向字符的指针。(b)string不用考虑内存释放和越界。(c)string提供了一系列的字符串操作函数(这个等下会详讲)查找find,拷贝copy,删除erase,替换replace,插入insert

2 string的存取字符操作
string类的字符操作:
const char &operator[] (int n) const;
const char &at(int n) const;
char &operator[] (int n);
char &at(int n);

3 字符指针和字符串的转换
string s1 = “aaabbbb”; //这就是char* 转成string
const char *c_str() const; //返回一个以’\0’结尾的字符串的首地址

4 string的长度
int length() const; //返回当前字符串的长度。长度不包括字符串结尾的’\0’。
bool empty() const; //当前字符串是否为

5 string字符串连接
string &operator+=(const string &s); //把字符串s连接到当前字符串结尾
string &operator+=(const char *s);//把字符串s连接到当前字符串结尾
string &append(const char *s); //把字符串s连接到当前字符串结尾
string &append(const char *s,int n); //把字符串s的前n个字符连接到当前字符串结尾
string &append(const string &s); //同operator+=()
string &append(const string &s,int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string &append(int n, char c); //在当前字符串结尾添加n个字符c

6 string的查找和替换
(1)查找
find函数如果查找不到,就返回-1
int find(char c,int pos=0) const; //从pos开始查找字符c在当前字符串的位置
int find(const char *s, int pos=0) const; //从pos开始查找字符串s在当前字符串的位置
int find(const string &s, int pos=0) const;//从pos开始查找字符串s在当前字符串中的位置
rfind是反向查找的意思,如果查找不到,返回-1
int rfind(char c, int pos=npos) const; //从pos开始从后向前查找字符c在当前字符串中的位置
int rfind(const char *s, int pos=npos) const;
int rfind(const string &s, int pos=npos) const;//rfind是反向查找的意思,如果查找不到,返回-1
(2)替换
string &replace(int pos, int n, const char *s);//删除从pos开始的n个字符,然后在pos处插入串s
string &replace(int pos, int n, const string &s); //删除从pos开始的n个字符,然后在pos处插入串s
void swap(string &s2); //交换当前字符串与s2的值

7 string的比较
int compare(const string &s) const; //与字符串s比较
int compare(const char *s) const; //与字符串s比较
compare函数在>时返回 1,<时返回 -1,==时返回 0。比较区分大小写,比较时参考字典顺序,排越前面的越小。大写的A比小写的a小。

8 String的区间删除和插入
(1)删除
string &erase(int pos=0, int n=npos); //删除pos开始的n个字符,返回修改后的字符串
(2)插入
string &insert(int pos, const char *s);
string &insert(int pos, const string &s);
//前两个函数在pos位置插入字符串s
string &insert(int pos, int n, char c); //在pos位置插入n个字符c

二Vector容器
1简介
vector是将元素置于一个动态数组中加以管理的容器。vector可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法,这个等下会详讲)。vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时

2vector对象的默认构造
vector采用模板类实现,vector对象的默认构造形式
vector vecT;

vector<int> v1;
cout << "length:" << v1.size() <<endl;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
cout << "length:" << v1.size() <<endl;//长度

3 vector对象的带参数构造
vector(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
vector(n,elem); //构造函数将n个elem拷贝给本身。
vector(const vector &vec); //拷贝构造函数

void main()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
vector<int> v2 = v1;  //对象初始化
vector<int> v3(v1.begin(), v1.begin()+2 );
}

4 vector的赋值
vector.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
vector.assign(n,elem); //将n个elem拷贝赋值给本身。
vector& operator=(const vector &vec); //重载等号操作符
vector.swap(vec); // 将vec与本身的元素互换。

vector<int> vecIntA,vecIntB,vecIntC,vecIntD; 
int  iArray[] = {0,1,2,3,4}; 
vecIntA.assign(iArray,iArray+5);
vecIntB.assign( vecIntA.begin(),  vecIntA.end() );    //用其它容器的迭代器作参数。 
vecIntC.assign(3,9);  
vector<int> vecIntD; 
vecIntD = vecIntA;  
vecIntA.swap(vecIntD); 

5 vector的存取
(1) 通过数组的方式

void printV(vector<int> &v)
{
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " ";
	}
}

(2)通过迭代器的方式

//正向遍历
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it ++ )
{
	cout << *it << " ";
}
//逆序遍历
for (vector<int>::reverse_iterator rit = v1.rbegin(); rit!=v1.rend(); rit++ )
{
	cout << *rit << " ";
}

(3)首尾

int iF = vector.front();	//iF==1
int iB = vector.back();	//iB==9

6 vector的大小

vector.size(); //返回容器中元素的个数
vector.empty(); //判断容器是否为空
vector.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
vector.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

7 vector的遍历

vector<int>  vecInt; //假设包含1,3,5,7,9元素 
正向遍历: 
for(vector<int>::iterator it=vecInt.begin(); it!=vecInt.end(); ++it) 
{ 
  int iItem = *it; 
  cout << iItem;    //或直接使用  cout << *it; 
} 

这样子便打印出1 3 5 7 9

逆向遍历: 
for(vector<int>::reverse_iterator rit=vecInt.rbegin(); rit!=vecInt.rend(); ++rit)    //注意,小括	号内仍是++rit 
{ 
               int iItem  = *rit; 
  cout << iItem;      //或直接使用cout << *rit; 
} 

此时将打印出9,7,5,3,1

8 vector的删除
vector.clear(); //移除容器的所有数据
vec.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
vec.erase(pos); //删除pos位置的数据,返回下一个数据的位置。

//区间删除
v1.erase(v1.begin(), v1.begin()+3);
//根据元素的位置 指定位置删除
v1.erase(v1.begin()); //在头部删除一个元素
//迭代器删除
for (vector<int>::iterator it =v1.begin(); it != v1.end();)//此处不用再写it++
{
	if (*it == 2)
	{
		it =v1.erase(it);  
	//当 删除迭代器所指向的元素的时候,erase删除函数会让it自动下移动
	}
	else
	{
		it ++;
	}
}

9vector的插入
vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
vector.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值

     vector<int> vecA; 
     vector<int> vecB; 
     vecA.push_back(1); 
     vecA.push_back(3); 
     vecA.push_back(5); 
     vecA.push_back(7); 
     vecA.push_back(9); 

     vecB.push_back(2); 
     vecB.push_back(4); 
     vecB.push_back(6); 
     vecB.push_back(8); 
vecA.insert(vecA.begin(), 11);// 开始位置插入11 {11, 1, 3, 5, 7, 9} 
vecA.insert(vecA.begin()+1,2,33); // 第二位置插入两个33{11,33,33,1,3,5,7,9} 

//在开始位置插入B的值{2,4,6,8,11,33,33,1,3,5,7,9} 
vecA.insert(vecA.begin() , vecB.begin() , vecB.end() );   

三Deque容器
1 简介
头文件#include <deque>
deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
deque可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法,这个等下会详讲)。

2 deque的添加和删除
deque.push_back(elem); //在容器尾部添加一个数据
deque.push_front(elem);//在容器头部插入一个数据
deque.pop_back(); //删除容器最后一个数据
deque.pop_front(); //删除容器第一个数据

3 求deque中某个值在数组中的下标

 //查找 -33 在数组下标的值
deque<int>::iterator it =  find(d1.begin(), d1.end(), -33 );
if (it != d1.end())
{
	cout << "-33数组下标是" << distance(d1.begin(), it) <<endl;
}
else
{
	cout << "没有找到值为-33的元素" << endl;
}

4 deque的数据存取

deque.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
deque[idx]; //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
deque.front(); //返回第一个数据。
deque.back(); //返回最后一个数据

5 deque与迭代器
² deque.begin(); //返回容器中第一个元素的迭代器。
² deque.end(); //返回容器中最后一个元素之后的迭代器。
² deque.rbegin(); //返回容器中倒数第一个元素的迭代器。
² deque.rend(); //返回容器中倒数最后一个元素之后的迭代器。

6 deque的大小
deque.size(); //返回容器中元素的个数
deque.empty(); //判断容器是否为空
deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

7 deque的插入和删除(用法与vector一样)

四stack容器
1 简介
#include <stack>
stack是堆栈容器,是一种“先进后出”的容器。
stack是简单地装饰deque容器而成为另外的一种容器。

2 stack对象的默认构造
stack采用模板类实现, stack对象的默认构造形式: stack stkT;

stack <int> stkInt;            //一个存放int的stack容器。 	
stack <float> stkFloat;     //一个存放float的stack容器。 
stack <string> stkString;     //一个存放string的stack容器。 

3 stack的push()与pop()方法
stack.push(elem); //往栈头添加元素
stack.pop(); //从栈头移除第一个元素

stack<int> stkInt;           
stkInt.push(1);
stkInt.push(3);
stkInt.pop();   
stkInt.push(5);
stkInt.push(7);  
stkInt.push(9);
stkInt.pop();          
stkInt.pop();  
此时stkInt存放的元素是1,5  

4 stack对象的拷贝构造与赋值
stack(const stack &stk); //拷贝构造函数
stack& operator=(const stack &stk); //重载等号操作符

               stack<int> stkIntA; 
               stkIntA.push(1); 
               stkIntA.push(3); 
               stkIntA.push(5); 
               stkIntA.push(7); 
               stkIntA.push(9); 
               stack<int> stkIntB(stkIntA);   //拷贝构造 
               stack<int> stkIntC; 
               stkIntC = stkIntA;             //赋值 

5 stack的数据存取
stack.top(); //返回最后一个压入栈元素

              	 stack<int> stkIntA; 
               stkIntA.push(1); 
               stkIntA.push(3); 
               stkIntA.push(5); 
               stkIntA.push(7); 
               stkIntA.push(9); 
                int iTop = stkIntA.top();             //9 
               stkIntA.top() = 19;                      //19 

6 stack的大小
stack.empty(); //判断堆栈是否为空
stack.size(); //返回堆栈的大小

               	stack<int> stkIntA; 
               stkIntA.push(1); 
               stkIntA.push(3); 
               stkIntA.push(5); 
               stkIntA.push(7); 
               stkIntA.push(9); 

               if (!stkIntA.empty()) 
               { 
                        int iSize = stkIntA.size();           //5 
               } 

猜你喜欢

转载自blog.csdn.net/weixin_40878579/article/details/84928699