一、vector容器
1、
存放内置数据类型
- 创建容器 :vector<数据类型> v;
- 插入数据:push_back();v.insert();v.assign();
- 尾部删除:pop_back();v.erase();
- 指向容器中第一个元素:v.begin();
- 指向容器中第一个元素前一个:v.rbegin();
- 指向容器中最后一个元素下一个位置:v.end();
- 指向容器中最后一个元素:v.rend();
- 容器交换:容器1.swap(容器2);
- 数据存取:at();[];front();back();
- 预留空间:v.reserve();
- 通过迭代器访问数据:vector<数据类型>::iterator
- STL内置的遍历算法:for_each(_InputIterator __first, _InputIterator __last, _Function __f) _InputIterator __first指容器中第一个元素,_InputIterator __last表示容器中最后一个元素下一个位置,_Function __f为自定义函数
代码示例:
vector<int> v; //创建容器
//通过puch_back()插入数据
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
①、通过while循环遍历
//通过迭代器访问数据
vector<int>::iterator itBegin = v.begin(); //指向容器中第一个元素
vector<int>::iterator itEnd = v.end(); //指向容器中最后一个元素下一个位置
while (itBegin != itEnd)
{
cout << *itBegin << endl; // 解引用输出数据
itBegin ++;
}
②、通过for循环遍历
for ( vector<int>::iterator itBegin = v.begin(); itBegin != itEnd; itBegin ++)
{
cout << *itBegin << endl;
}
③、通过STL内置的for_each算法遍历
void print(int i)
{
cout << i << endl;
}
//利用STL的算法for_each
for_each(v.begin(), v.end(), print);
2、存放自定义数据类型
原理与上述一致,没太大区别,示例代码如下
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
//自定义数据类型Person
class Person
{
public:
Person(string name, int age)
{
this->name = name;
this->age = age;
}
public:
int age;
string name;
};
void test()
{
vector<Person> v;
//定义数据
Person p1("Tom", 11);
Person p2("Jack", 12);
Person p3("acsi", 18);
//向容器中插入数据
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
//遍历数据
for(vector<Person>::iterator itBegin = v.begin(); itBegin != v.end(); itBegin ++)
{
cout << (*itBegin).name << " " << (*itBegin).age << endl;
}
}
int main()
{
test();
return 0;
}
3、vector的嵌套
vector容器内也可存放小容器,即为容器嵌套
vector<vector<int>> v;
二、string容器
1、函数构造
- string();//创建一个空字符串
- string(const char* s);//使用字符串s初始化
- string(const string& str);//使用另外一个string对象初始化
- string(int n,char c);//使用n个字符c初始化
2、其它操作
- 字符存取:[]或者at
- 插入:insert()
- 删除:erase()
- 获取子串:substr()
三、deque容器
- 头部插入/删除:push_front();pop_front();
- 尾部插入/删除:push_back();pop_back();
- 第一个/最后一个元素:front();back();
- 迭代器:begin();end();
- 要限制容器可读,迭代器也要设置为可读
- 构造、数据存取和赋值与vector类似
- 排序:利用STL的sort()算法,默认升序
sort(d.begin(), d.end());
四、stack容器
特点:先进后出,单端容器
接口:
构造函数:
- stack<数据类型> stk;
- stack(const stack &stk) //拷贝构造函数
赋值:
stack& operator=(const stack &stk) //重载等号运算符
数据存取:
入栈:push(elem)
出栈:pop()
反悔栈顶元素:top()
五、queue容器
特点 :先进先出,双端容器,只能对尾进,对头出
接口:
构造函数和赋值与stack一致;
数据存取:
- 入队:push(elem)
- 出队:pop()
- 返回最后一个元素:back()
- 返回第一个元素:front()
六、list容器
特点:链式存储,非连续空间。一个节点由数据域和指针域构成,指针域为双向的,既指向下一个节点,也记录前一个节点。这种结构使得在任意位置插入和删除数据变得高效、遍历速度慢、占用空间大,不支持随机访问,需调用成员函数0
接口:与前面容器一致,下面是新增的接口
remove(elem):删除容器中与elem相匹配的元素
reverse():反转
L.sort():排序,对于自定义数据类型,需制定规则接口
七、set/multiset容器
特点:所有元素在插入时会自动排序,set不允许有重复元素,multiset允许
接口:
构造和赋值操作与其它容器一致
不同的是插入数据只有insert()操作,删除数据只有erase()。
在存放自定义数据类型时应该先制定数据排序规则(仿函数),不然编译器不知道怎么排序
下面自定义了一个Person类,并存放在set容器中,按照年龄进行排序
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
#include <deque>
#include <set>
class Person
{
public:
Person(string name, int age)
{
this->name = name;
this->age = age;
}
public:
int age;
string name;
};
//制定仿函数排序规则,按照年龄降序排序
class ComparePerson
{
public:
//返回值是bool类型
bool operator()(const Person&p1, const Person&p2)const
{
return p1.age > p2.age;
}
};
void test()
{
set<Person, ComparePerson>s;//在定义集合之前将仿函数传入
//定义数据
Person p1("jack", 18);
Person p2("manky", 20);
Person p3("Tom", 21);
Person p4("sin", 22);
//插入数据
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for(set<Person, ComparePerson>::iterator itBegin = s.begin(); itBegin != s.end(); itBegin++)
{
cout << (*itBegin).name << " " << (*itBegin).age << endl;
}
}
int main()
{
test();
return 0;
}
七、map/multimap容器
特点:所有元素都是pair,第一个值为key,第二个为value,会安装key自动排序,如果要修改排序规则则与list一样自己定义仿函数
map不允许有重复key值,而multimap允许
接口:
构造和赋值与之前容器一致
map<int, int>m;
//插入数据
m.insert(pair<int, int>(1,10));
m.insert(pair<int, int>(2,20));
m.insert(pair<int, int>(3,30));
for (map<int, int>::iterator it = m.begin(); it!=m.end(); it++)
{
cout << (*it).first << " " << (*it).second << endl;
}