STL容器:
近容器 | 顺序容器 | 关联容器 |
---|---|---|
string | vector | set |
arr[ ] | list | multiset |
deque | map | |
multimap |
容器适配器 | |
---|---|
stack | deque |
queue | deque |
模板打印函数:
template<typename CON>
void show_con(CON& con)
{
typename CON::iterator it = con.begin();
for (; it != con.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
1.近容器:
1.1string:这类容器中只能放入字符串,故称为近容器,arr[]也是如此。
1.1.1构造:
string s;
string s("abcdefg");//直接赋值构造;
string s1(s);//拷贝构造
string s2(s1.begin(),s1.end());//通过迭代器构造
1.1.2通过迭代器访问
(1)通过下标访问
for (int i = 0; i < 10; i++)
{
s.push_back('a'+i);//尾插
}
s.pop_back();//尾删
for (int i = 0; i < s.size(); i++)
{
if (s[i] == 'b')
{
s[i] = 'y';
}
cout << s[i] << " ";
}
(2)通过迭代器访问(增删改查)
string::iterator it = s.begin();//迭代器
for (; it != s.end(); it++)
{
if (*it == 'a')
{
//it = s.insert(it, 'm');//迭代器进行增删时要重新获取迭代器
//cout << *it << " ";
///it++;//增加
//it = s.erase(it);//删除
*it='b';//改
}
cout << *it << " ";//查
}
cout << endl;
1.1.3string容器里的方法
s.back();//返回最后一个
s.front();//返回第一个
s.empty();//判空
int sit = s.find("def");//查找。返回值是位置,有的容器里返回的是迭代器。
//返回下标,没找到返回-1
s.clear();//清空
char err[10] = { "abcdefg" };//拷贝
char* p = err;
s.copy(p,4);//从对象拷贝到指针
s.swap(s1);//交换两个容器的数据
2顺序容器:
2.1:vector 一维数组 按照1.5倍扩容
头文件:#include<vector
构造:
vector<int> v;
vector<int> v1(v);
vector<int> v2(v1.begin(),v1.end());
通过迭代器(增删改查)
vector<int>::iterator it = v1.begin();
for (; it != v1.end(); it++)
{
if (*it == 5)
{
//it = v1.insert(it, 999);
//it++;
//*it = 999;//增
it = v1.erase(it);删
}
cout << *it << " ";
}
方法
v.push_back(i);
v.pop_back();
v.back();
v.front() ;
v.size() ;//实际元数个数
v.max_size();//容器最大容积
v.swap(v1);//交换
v.clear();
v.empty();
v.resize(10);
v.reserve(10);
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));//这个拷贝等于输出/打印
2.2:list 链表
头文件:#include<list
(1)构造:
list<int> L;
list<int> v1(v);
list<int> v2(v1.begin(),v1.end());
(2)方法:
L.push_back(i);
L.push_front(3);//list特有的头插
L.pop_front();//list特有的头删
和vector大部分相同
L.resize(20);
L.reverse();
2.3:deque 双端队列 二维数组
头文件:#include<deque
空的 deque 容器在创建之后可以做添加或删除元素的操作.
当需要向序列两端频繁的添加或删除元素时,应首选 deque 容器。
起始位置在中间5处,有头指针和尾指针可以同时分别向前和向后,一般不常用。
3.关联容器
此类容器在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C++ 基础数据类型或自定义类型的元素),它的功能是在使用关联式容器的过程中,如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。
3.1:set 集合 数据有序 红黑树 不允许重复
set本质是一种集合,可以自动给数据排序(底层通过红黑树实现),不允许重复。
头文件:#include <set
插入
set<int> s;
s.insert(23);//set的插入不同。
s.insert(34);
s.insert(78);
s.insert(67);
s.insert(56);
s.insert(56);
show_con(s);
查找:
set<int>::iterator it = s.find(12);//返回的是迭代器
if (it != s.end())
{
cout << *it << endl;
}
else
{
cout << "not find" << endl;
}
3.2:multiset 多重集合 数据有序 红黑树 允许重复
multiset只比set多出可重复功能。
multiset<int> s;
s.insert(23);
s.insert(34);
s.insert(78);
s.insert(67);
s.insert(56);
s.insert(56);
show_con(s);
3.3:map 映射表 数据按key有序 红黑树 不允许重复
头文件:#include<map
map<int, string> mm;
mm.insert(make_pair(1, "aaa"));
mm.insert(make_pair(2, "bbb"));
mm.insert(make_pair(5, "eee"));
mm.insert(make_pair(3, "ccc"));
mm.insert(pair<int, string>(4, "ddd"));
map<int, string>::iterator it = mm.begin();
for (; it != mm.end(); it++)
{
cout << it->first << "-->";map的输出first是第一个键
cout << it->second << endl;map的输出second是第二个键
}
map<int, string>::iterator it1 = mm.find(2);//返回迭代器
if (it1 != mm.end())
{
cout << it1->first << "-->";
cout << it1->second << endl;
}
else
{
cout << "not find" << endl;
}
cout << mm[4]<<endl;//这种输出方式存在风险
3.4multimap 多重映射表 数据按key有序 红黑树 允许重复
multimap<int, string> mmm;
mmm.insert(make_pair(1, "aaa"));
mmm.insert(make_pair(2, "bbb"));
mmm.insert(make_pair(5, "eee"));
mmm.insert(make_pair(3, "ccc"));
mmm.insert(make_pair(2, "fff"));
mmm.insert(make_pair(5, "ddd"));
mmm.insert(make_pair(3, "sss"));
multimap <int, string>::iterator it2 = mmm.begin();
for (; it2 != mmm.end(); it2++)
{
cout << it2->first << "-->";
cout << it2->second << endl;
}
return 0;
}