STL容器总结

一、vector(相当于数组,但可以动态分配空间)(单向)

1.vector的构造函数

​
(1)直接构造

# include <vector>
vector<int> v;

(2)

# include <vector>
vector<int> v2(v1.begin(),v1.end());//将v1全盘复制给v2

(3)

# include <vector>
vector<int> v(10,100);//在v中插入10个100

(4)

# include <vector>
vector<int> v1(v2);//将v2复制给v1

​

2.vector的赋值

​
(1)

# include <vector>

vector<int> v;
v.assign(10,100);//v赋值10个100

(2)

# include <vector>

vector<int> v1;
v1.assign(v2.begin(),v2.end());//将v2赋值给v1

(3)

# include <vector>

vector<int> v1;
v1=v2;//将v2赋值给v1

3.vector大小和容量

# include <vector>

vector<int> v;
v.empty();//如果v为空则返回真,不为空则返回假

v.capacity();//返回容器的容量大小

v.size();//返回容器的元素个数

v.resize(int num);//重新指定容器的长度为num,若容器变长,则以0填充,若容器变短,则删除后面的数据

v.resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充,若容器变短,则删除后面的数据

4.vector插入与删除

​
(1)尾插

# include <vector>

vector<int> v;
v.push_back(10);//插入一个10

(2)尾删

# include <vector>

vector<int> v;
v.pop_back();//删除最后一元素

(3)插入

# include <vector>

vector<int> v;
v.insert(v.begin(),100);//在v的开头插入100
v.insert(v.begin(),2,100);//在v的开头插入2个100

(4)删除

# include <vector>

vector<int> v;
v.erase(v.begin());//删除第一个元素
v.erase(v.begin(),v.end());//清空
v.clear();//清空


​

5.vector数据的存取与互换

​
(1)获取

# include <vector>
using namespace std;

vector<int> v;
cout<<v.at(3)<<endl;//输出第三个元素
cout<<v[3]<<endl;//输出第三个元素
cout<<v.front()<<endl;//输出第一个元素
cout<<v.back()<<endl;//输出最后一个元素

(2)互换

# include <vector>

vector<int> v1;
vector<int> v2;

v1.swap(v2);//将v1和v2互换


​

6.vector预留空间

# include <vector>

vector<int> v;
v.reserve(100);//提前预留出100的空间,不需要再后续动态分配空间

7.vector的输出

# include <vector>

using namespace std;

vector<int> v;
//第一种输出方式
for(vector<int>::iterator it=v.begin();it!=v.end();++it)
{    
    cout<<*it<<" ";
}
cout<<endl;
//第二种输出方式
# include <algorithm>
void f(int a)
{
    cout<<a<<endl;
}
for_each(v.begin(),v.end(),f);//调用"algorithm"中的for_each遍历函数

8.vector的嵌套与输出

# include <vector>

vector<vector<int>> v;

vector<int> v1;
vector<int> v2;

for(int i=0;i<2;++i)
{
    v.push_back(i+1);
    v.push_back(i+2);
}

v.push_back(v1);
v.push_back(v2);

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

二、string容器

1.string构造函数

# include <string>
//第一种
string str;
//第二种
const char* str1="Hello C++";
string str2(str1);//将str1复制给str2
//第三种
string str1;
string str2(str1);//将str1赋值给str2
//第四种
string str(10,'a');//str初始化为10个'a'

2.string的赋值

# include <string>

//第一种
string str;
str="Hello World!";
//第二种
string str1,str2;
str1=str2;
//第三种
string str;
str='a';
//第四种
string str;
str.assign("Hello C++");
//第五种
string str;
str.assign("Hello C++",5);//赋值字符串的前五个
//第六种
string str;
str.assign(str1);//将上str1赋值给str
//第七种
string str;
str.assign(10,'a');//str赋值10个'a'

3.string追加

# include <string>
//第一种方式
string str;
str="I";
str=str+"like";
cout<<str<<endl;//输出I like
//第二种方式
string str1,str2;
str1="I like";
str2="game";
str2=str2+str1;
cout<<str2<<endl;//输出"I like game"
//第三种方式
string str,str1;
str1="abcdef";
str="I";
str.append("like");//在str后面追加like
str.append("game",5);//在str后面继续追加game
str.append(str1,2,3);//在str后面追加从str1下标为2的后面3个,即追加cde

4.string查找

# include <string>
//find查找
string str="abcdefg";
int a=str.find("de");//从左向右查找,找到后就返回de中d的位置序号,即3;没有找到就返回-1
//rfind查找
string str="abcdefg";
int a=str.rfind("de");//从右向左查找,找到后就返回de中d的位置序号,注意位置序号还是从左向右,即3;没有找到就返回-1

5.string替换

# include <string>

string str;
str="abcdefg";
str.replace(1,3,"111");//将序号为1的位置起的3个字符换为"111";

6.string对比

# include <string>

string str1,str2;

int a=str1.compare(str2);//如果str1=str2,就返回0;如果str1>str2,就返回1;如果str1<str2,就返回-1

7.string单个字符的存取

# include <string>

string str;
str="Hello World!";
//第一种输出方法
for(int i=0;i<str.size();++i)//str.size()可以返回str里面元素个数
{
    cout<<str.at(i);<<endl;
}
//第二种输出方法
for(int i=0;i<str.size();++i)//str.size()可以返回str里面元素个数
{
    cout<<srt[i]<<endl;
}

8.string的插入与删除

# include <string>

string str;
str="Hello C++";
//插入
str.insert(1,"111");//在序号为1的位置插入"111",即变为H111ello C++
//删除
str.erase(1,3);//从序号为1的位置开始删除三个元素,即变为Ho C++

9.string的截取

# include <string>

string str="zhang@qq.com";
int a=str.find("@");
string str1=str.substr(0,a);//从0号位置开始截取a个
cout<<str1<<endl;//输出zhang

三、deque容器(双向)

1.dedque的构造函数

​

(1)直接构造
# include <deque>
deque<int> d;
(2)
# include <deque>
deque<int> d2(d1.begin(),d1.end());//将v1全盘复制给v2
(3)
# include <deque>
deque<int> d(10,100);//在v中插入10个100
(4)
# include <deque>
deque<int> d1(v2);//将v2复制给v1


​

2.deque的赋值

​

(1)
# include <deque>

deque<int> d;
d.assign(10,100);//v赋值10个100
(2)
# include <deque>
deque<int> d1;
d1.assign(d2.begin(),d2.end());//将v2赋值给v1
(3)
# include <deque>
deque<int> d1;
d1=d2;//将v2赋值给v1

​

3.deque的大小和容量

# include <deque>

deque<int> d;
d.empty();//如果d为空则返回真,不为空则返回假

//d.capacity();//特别注意deque没有capacity这一属性

d.size();//返回容器的元素个数

d.resize(int num);//重新指定容器的长度为num,若容器变长,则以0填充,若容器变短,则删除后面的数据

d.resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充,若容器变短,则删除后面的数据

4.deque的删除和插入

# include <deuqe>

deuqe<int> d1;
deuqe<int> d2;
d1.insert(d1.begin(),100);//在d1的开头插入100
d1.insert(d1.begin(),2,100);//在d1的开头插入2个100
d1.insert(d1.begin(),d2,begin(),d2,end());//在di的开头插入d2

deuqe<int> d2;
d2.erase(d2.begin());//删除第一个元素
d2.erase(d2.begin(),d2.end());//清空
d2.clear();//清空

5.deque的存取

# include <deque>
using namespace std;

deque<int> d;
cout<<d.at(3)<<endl;//输出第三个元素
cout<<d[3]<<endl;//输出第三个元素
cout<<d.front()<<endl;//输出第一个元素
cout<<d.back()<<endl;//输出最后一个元素

6.deque的排序

# include <deque>
# include <algorithm>

deque<int> d;
sort(d.begin(),d.end());//用sort()函数要加上"# include <algorithm>"头文件,从小到大排序

四、stack容器(栈)(先进后出)

 

# include <stack>

stack<int> s;

s.empty();//若s为空则返回1,不为空则返回0
s.size();//返回栈中元素的个数
s.push(1);//向栈中插入元素1
s.top();//返回栈顶元素
s.pop();//删除栈顶元素

五、queue容器(队列)(先进先出)

# include <queue>

queue<int> q;

q.empty();//若q为空则返回1,不为空则返回0
q.size();//返回栈中元素的个数
q.push(1);//元素1从队尾入队
q.front();//返回对头元素
q.back();//返回对尾元素
q.pop();//删除队头元素

六、list容器(链表)

1.list的构造函数

# include <list>

list<int> l;//直接构造
list<int> l1(l2.begin(),l2.end());
list<int> l1(l2);
list<int> l(10,100);//赋值10个100

2.list的大小和容量

# include <list>

list<int> l;

l.size();
l.empty();
l.resize(10);
l.resize(5,4);//大小变为5,多的部分用4来补充
​

3.list的赋值和交换

​
(1)赋值

# include <list>

list<int> l;
l.assign(10,100);//l赋值10个100

(2)
# include <list>

list<int> l1;
l1.assign(l2.begin(),l2.end());//将l2赋值给l1

(3)
# include <list>

list<int> l1;
l1=l2;//将l2赋值给l1
​

(2)交换

# include <list>

list<int> l2,l3;
l2.swap(l3);//交换l2和l3


​

4.list数据的存取

# include <list>

list<int> l;

l.front();//返回l的第一个元素
l.back();//返回l的最后一个元素

//注意:list不支持l[i]和l.at(i),即不支持随机访问

5.list的反转

# include <list>

list<int> l;
l.reverse();//反转容器中的元素,即第一个和最后一个互换

6.list的排序

# include <list>

list<int> l;
//第一种:默认排序,从小到大
l.sort();
//第二种:指定规则排序
bool compare(int a,int b)
{
    return a>b;//从大到小排序
}
l.sort(compare);

for(list<int,compare>::iterator it=l.begin();it!=l.end();++it)
{
    cout<<*it<<endl;
}
//第三种:高级排序
class student
{
    public:
        student(string m_name,int m_age,int m_weight)
        {
            name=m_name;
            age=m_age;
            weight=m_weight;
        }
        string name;
        int age;
        int weight;
}

bool compare(student& stu1,student& stu2)
{
    if(stu1.age==stu2.age)
    {
        return stu1.weight>stu2.weight;
    }
    else
    {
        return stu1.age>stu2.age;
    }
}

list<student> l;

l.sort(compare);//先排年龄,年龄相同排体重

for(list<student,compare>::iterator it=l.begin();it!=l.end();++it)
{
    cout<<"Name="<<it->name<<"age"<<it->age<<"weight"<<it->weight<<endl;
}

七、set容器

1.set的赋值

# include <set>

set<int> s;
s.insert(10);//set只能用insert插入,不能用push_back()等
s.insert(20);
s.insert(20);//error,set容器不允许插入重复值
s.insert(5);//set容器会自动排序,从小到大排序

2.set的大小和交换

# include <set>

set<int> s1,s2;
s1.size();
s1.empty();
s1.swap(s2);//交换是s1和s2

3.set的插入与删除

# include <set>

set<int> s;

s.insert(20);//插入20
s.erase(s.begin());//删除set容器的头部
s.erase(30);//删除set容器中30那个元素
s.erase(s.begin(),s.end());//清空
s.clear();//清空

4.set的统计与查找

# include <set>

set<int> s;
set<int>::iterator it=s.find(30);
if(it!=s.end())
{
    cout<<"找到了30这个元素"<<endl;
}
else
{
    cout<<"m没有找到了30这个元素"<<endl;
}

int num=s.count(30);//统计set容器中30的个数

5.set的排序

# include <set>

class compare
{
    public:
        bool operator()(int a,int b)//operator是固定的,不是随便的函数名
        {
            return a>b;//从大到小排序
        }
}

set<int,compare> s;//set容器的排序必须在定义的时候就指定
s.insert(10);
s.insert(40);
s.insert(30);
s.insert(20);

for(set<int,compare>::iterator it=s.begin();it!=s.end();++it)
{
    cout<<*it<<" ";
}
cout<<endl;

7.set自定义消息排序

# include <set>

class student
{
    public:
        student(string m_name,int m_age,int m_weight)
        {
            name=m_name;
            age=m_age;
            weight=m_weight;
        }
        string name;
        int age;
        int weight;
}

class compare
{
    public:
        bool operator()(const student& stu1,const student& stu2)
        {
            if(stu1.age==stu2.age)
            {
                return stu1.weight>stu2.weight;
            }
            else
            {
                return stu1.age>stu2.age;
            }
        }
}

set<student,compare> s;//先排年龄,年龄相同排体重

for(set<int,compare>::iterator it=s.begin();it!=s.end();++it)//输出
{
    cout<<*it<<" ";
}
cout<<endl;

6.set和multiset的区别

set容器中不能插入重复数字,但是multiset中可以插入重复数字;使用set和multiset都只用写头文件“# include <set>”,没有头文件“# include <multiset>”

八、pair容器(对组)

//不用包含什么头文件

//第一种创建方式
pair<string, int>p("aaa",20);
cout<<p.first<<p.second<<endl;

//第二种创建方式
pair<string,int>p=make_pair("aaa",20);//使用make_pair的方式
cout<<p.first<<p.second<<endl;

九、map容器

1.map的构造函数

# include <map>

map<int,int>m;//默认构造

map<int,int>m1(m2);//将m2赋值给m1

map<int,int>m1;//赋值
m1=m2;

2.map的插入与输出

# include <map>

map<int,int> m;

m.insert(pair<int,int>(1,10));//插入

void printfmap(map<int,int>& m)//输出
{
    for(map<int,int>::iterator it=m.begin();it!=m.end();++it)
    {
        cout<<"key="<<it->first<<"value="<<it->second<<endl;
    }
    cout<<endl;
}

3.map的大小和交换

# include <map>

map<int,int> m,m1;
m.size();//返回容器中元素的个数
m.empty();//判断容器是否为空
m.swap(m1);//交换容器m和容器m1

4.map的插入与删除
 

# include <map>

map<int,int> m;

m.insert(pair<int,int>(1,10));//第一种插入方式

m.insert(make_pair(1,10));//第二种插入方式

m.insert(map<int,int>::value_type(3,30));//第三种插入方式

m[4]=40;//第四种插入方式



m.erase(m.begin());//删除第一个元素

m.erase(3);//删除第三个元素

m.erase(m.begin(),m.end());//清空

m.clear();//清空

5.map的查找和统计

# include <map>

map<int,int> m;

map<int,int>::iterator it=m.find(3);//查找
if(it!=m.end())
{
    cout<<"找到key值为3的元素"<<endl;
}
else
{
    cout<<"没有找到"<<endl;
}

int num=m.count(3);//统计,其实结果只能是1或者0
cout<<"元素中key值为3的个数是:"<<num<<endl;

6.map的排序

# include <map>

class compare
{
    public:
        bool operator()(int a,int b)
        {
            return a>b;
        }
};

map<int,int,compare> m;

for(map<int,int,compare>::iterator it=m.begin();it!=m.end();++it)//按照指定顺序输出
{
    cout<<"key="<<it->first<<"value="<<it->second<<" ";
}
cout<<endl;

​








/*map自定义数据类型的排序*/

# include <iostream>
# include <map>
# include <ctime>		//time()函数所在库(或者"time.h")
# include <stdlib.h>		//rand()函数和srand()函数所在库

using namespace std;

class student
{
	public:
		student(int m_age,int m_weight)
		{
			age=m_age;
			weight=m_weight;
		}
		int age;
		int weight;
};

class compare
{
	public:
		bool operator()(student stu1,student stu2)
		{
			if(stu1.age==stu2.age)
				return stu1.weight>stu2.weight;
			else
				return stu1.age>stu2.age;
		}
};

int main (void)
{
	srand ( time ( NULL ) );
	//cout << rand() % a + b << endl;//可以产生b+(0~a-1)范围的数字
	
	map<student,int,compare> m;
	
	student stu1((rand() % 10 + 51),(rand() % 10 + 51));
	student stu2((rand() % 10 + 51),(rand() % 10 + 51));
	student stu3((rand() % 10 + 51),(rand() % 10 + 51));
	student stu4((rand() % 10 + 51),(rand() % 10 + 51));
	
	m.insert(make_pair(stu1,29));
	m.insert(make_pair(stu2,89));
	m.insert(make_pair(stu3,78));
	m.insert(make_pair(stu4,45));
	
	for(map<student,int,compare>::iterator it=m.begin();it!=m.end();++it)
	{
		cout<<"first.age:"<<(*it).first.age<<"first.weight:"<<(*it).first.weight<<"second:"<<it->second<<endl;
	}
	
	return 0;
} 










​

6.map和multimap的区别

map的key值不同重复,multimap中的key值可以重复

 十、容器应用实例

(1)创建10名员工,分别随机在三个部门,随机拥有工资,输出员工信息

# include <iostream>
# include <string>
# include <vector>
# include <ctime>
# include <stdlib.h>
# include <map>

using namespace std;

#define Chinese  0
#define Math     1 
#define English  2

class worker
{
	public:
		int salary;
		string name;
};

//创建员工  
void createworker(vector<worker>& w)
{
	string nameseed="ABCDEFGHIJ";
	for(int i=0;i<10;++i)
	{
		int a=rand() % 10000 + 10000;//可以产生b+(0~a-1)范围的数字
		worker wk;
		wk.name="Worker";
		wk.name+=nameseed[i];
		wk.salary=a;
		w.push_back(wk);
	}
}

//员工分组 
void setgroup (vector<worker>& v,multimap<int,worker>& m)
{
	for(vector<worker>::iterator it=v.begin();it!=v.end();++it)
	{
		int depId=rand()%3;
		m.insert(make_pair(depId,*it));
	}
}

void showworker (multimap<int,worker>& m)
{
	cout<<"Chinese:"<<endl;
	multimap<int,worker>::iterator it=m.find(0);
	int num=m.count(0);
	for(int i=0;it!=m.end()&&i<num;++it,++i)//map和multimap可以自动排序 
	{
		cout<<"name:"<<it->second.name<<" "<<"salary:"<<it->second.salary<<endl; 
	} 

	cout<<"-----------------"<<endl;

	cout<<"Math:"<<endl;
	it=m.find(1);
	num=m.count(1);
	for(int i=0;it!=m.end()&&i<num;++it,++i)//map和multimap可以自动排序 
	{
		cout<<"name:"<<it->second.name<<" "<<"salary:"<<it->second.salary<<endl; 
	} 

	cout<<"-----------------"<<endl;

	cout<<"English:"<<endl;
	it=m.find(2);
	num=m.count(2);
	for(int i=0;it!=m.end()&&i<num;++it,++i)//map和multimap可以自动排序 
	{
		cout<<"name:"<<it->second.name<<" "<<"salary:"<<it->second.salary<<endl; 
	} 
}

int main (void)
{
	srand ( time ( NULL ) );
	
	//创建员工 
	vector<worker> wk;
	createworker(wk); 
	//员工分组 
	multimap<int,worker> mk;
	setgroup (wk,mk); 
	//员工显示 
	showworker(mk); 
	
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值