一、C++中容器类型
C++中有两种类型的容器:顺序容器和关联容器
顺序容器主要有vector、list、deque等
关联容器主要有map和set
注意:容器类自动申请和释放内存,因此无需new和delete操作
二、迭代器
类似于专门用来指向容器成员的指针,用来遍历、操作、管理容器中的成员,可以大大提高对容器的访问速度
用法:容器类名<>::iterator 迭代器名*迭代器
名就表示迭代器指向的元素,可以当做指针来用,但其实是类对象
begin() :获取指向第一个元素的迭代器
end() :获取指向最后一个元素的下一位置的迭代器
举个例子:
#include <iostream>
#include <list>
using namespace std;
void show(list<int>& l)
{
list<int>::iterator it;
for(it=l.begin();it!=l.end();it++)
{
cout << *it << endl;
}
}
int main()
{
list<int> l;
for(int i=0;i<10;i++)
{
l.push_back(i);
}
show(l);
return 0;
}
三、vector
1、vector:向量容器,其实就是可变长的动态数组
2、基本的一些成员函数
例子:
#include <iostream>
#include <vector>
using namespace std;
void show(vector<int>& arr)
{
for(int i=0; i<arr.size(); i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
// 创建向量,设置容量并初始化
vector<int> arr(20,0);
show(arr);
// 向量支持[]运算符,所以被称为数组
for(int i=0; i<10; i++)
{
arr[i] = i;
}
show(arr);
vector<int> arr1(10,0);
// 支持比较运算符
cout << (arr[0]==arr1[0]) << endl;
// at成员函数,相当于[]操作
for(int i=0; i<arr.size(); i++)
{
cout << arr.at(i) << endl;
}
// 获取向量的容量
cout << arr.capacity() << endl;
}
四、list
1、list:双端链表容器,即每个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素,与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢
2、基本的一些成员函数
例子:
#include <iostream>
#include <list>
using namespace std;
//遍历输出链表
void show(list<int>& l)
{
//逆向迭代器
list<int>::reverse_iterator it;
for(it=l.rbegin();it!=l.rend();it++)
{
cout << *it << endl;
}
}
int main()
{
//创建链表
list<int> l;
//使用数组对链表进行初始化
int arr[5] = {11,22,33,44,55};
l.assign(arr,arr+5);
for(int i=0;i<10;i++)
{
//尾部添加元素
l.push_back(i);
//头部添加
//l.push_front(i);
}
//链表逆序
l.reverse();
//链表排序,默认升序,但是链表中的元素必须支持比较运算,否则要提供比较函数
l.sort();
//创建另外一个链表
list<int> l1;
l1.assign(arr,arr+5);
//合并两个链表,被合并的链表(l1)就不存在了
l.merge(l1);
//判断链表是不是空链表
cout << (l1.empty() ? "空" : "非空") << endl;
//输出链表的最大容量
cout << l.max_size() << endl;
for(int i=0;i<5;i++)
{
//尾部删除元素
l.pop_back();
//头部删除元素
//l.pop_front();
}
//删除值为55的元素
l.remove(55);
show(l);
}
注意:当容器中的元素被删除后,之间获取到的迭代的结构就已经改变了,需要再次获取
五、map
1、C++中map容器提供一个键值对(key/value)容器,map与multimap差别仅仅在于multiple允许一个键对应多个值,而在map中key的值不能重复,对于迭代器来说,可以修改实值,而不能修改key,Map会根据key自动排序
2、基本的一些成员函数
例子:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> m;
m.insert(make_pair(1000,"hehe"));
m.insert(make_pair(1001,"haha"));
//输出图的大小
cout << m.size() << endl;
//根据key查找,输出的是value,即haha
cout << (*m.find(1000)).second << endl;
//获取迭代器
map<int,string>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
//输出key和value
cout << (*it).first << " " << (*it).second << endl;
}
}
六、set
1、set是集合容器,集合中的数据会自动排序,不能重复,set和multiset类似,它和 multiset的差别在于multiset中可以有有重复的元素
2、一些基本的成员函数
例子:
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
int arr[5] = {5,4,3,2,10};
//初始化集合
s.insert(arr,arr+5);
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
{
cout << *it << endl;
}
//查找X存不存在,存在输出1,不存在输出0
cout << s.count(3) << endl;
//输出大于或者等于X的第一个值,即输出10
cout << *s.lower_bound(6) << endl;
}
七、deque
1、deque是双端队列,用法与向量基本一致,但可以在头和尾快速插入和删除,它相比于 vector 的优点是,vector 在头部删除或添加元素的速度很慢,在尾部添加元素的性能较好,而 deque 在头尾增删元素都具有较好的性能
2、一些基本的成员函数
例子:
#include <iostream>
#include <deque>
using namespace std;
int main()
{
//创建一个队列,并初始化为0
deque<int> d(10,0);
for(int i=0; i<d.size(); i++)
{
d[i] = i;
}
for(int i=0; i<d.size(); i++)
{
cout << d[i] << endl;
}
}