解释及说明在程序中有体现:
什么是容器?
通俗的讲就是将常用的数据结构,如数组、链表、栈、队列、二叉树等封装成一个个模板类,以方便编程。
序列式容器:每个元素都有固定的位置,这取决于插入时机和地点,与元素值无关。
关联式容器:元素位置取决于特定的排序准则,与插入顺序无关。
1.vector容器
vetor是单端数组。是将元素置于一个动态数组中加以管理的容器,可以随机存取元素,支持用[]操作符和at()方法直接存取。vector容器可以在尾部非常快的添加和移除元素,但是在中部或头部插入或移除元素比较费时。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,0};
vector<int> v1;
vector<int> v2(10,10);
vector<int> v3(a,a+10);
for(vector<int>::iterator it = v2.begin(); it != v2.end(); it++) //迭代器输出
{
cout << *it << " ";
}
cout << endl;
for(int i = 0; i < v2.size(); i++)
{
cout << v2[i] << " ";
}
cout << endl;
for(int j=0; j < v3.size(); j++)
{
cout << v3[j] << " ";
}
cout << endl;
v1.resize(v2.size());
for(int i = 0; i < v2.size(); i++)
{
v1[i] = v2[i];
}
//cout << v1 << endl; //直接输出是错误的
for(int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
cout << v3.front() << endl; //返回v3第一个元素,不检查元素是否存在
cout << v3.back() << endl; //返回v3最后一个元素,不检查元素是否存在
v3.front() = 100; //可初始化
v3.back() = 200;
for(vector<int>::iterator it = v3.begin(); it != v3.end(); it++)
{
cout << *it << " ";
}
cout << endl;
v1.assign(a,a+10); //赋值
for(int i=0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
v1.assign(20,'e'); //赋值 打印出为20个101,不是字符e
for(int i=0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
v1.resize(30); //将元素数量改为30(增加的元素用default构造函数产生,多余的元素被删除)
for(vector<int>::iterator it= v1.begin(); it!=v1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
v1.resize(40,'d'); //将元素数量改为40(增加的元素用d(100)填充)
for(vector<int>::iterator it= v1.begin(); it!=v1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
v1.resize(5);
for(vector<int>::iterator it= v1.begin(); it!=v1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout <<"正向迭代器、反向迭代器、只读迭代器" << endl;
for(vector<int>::iterator it= v3.begin(); it!=v3.end(); it++) //正向迭代器
{
cout << *it << " ";
}
cout << endl;
for(vector<int>::reverse_iterator rit= v3.rbegin(); rit!=v3.rend(); ++rit) //反向迭代器 往常思想(从后往前输出,但it指针指在end后的一个位置,所以要先++)
{
cout << *rit << " ";
}
cout << endl;
for(vector<int>::const_iterator cit= v3.begin(); cit!=v3.end(); cit++) //只读迭代器
{
cout << *cit << " ";
}
cout << endl;
cout << "************插入***************" << endl;
v3.insert(v3.begin(),500);
for(vector<int>::iterator it= v3.begin(); it!=v3.end(); it++)
{
cout << *it << " ";
}
cout << endl;
v3.insert(v3.begin(), 10, 30); //v3开头插入10个30
for(vector<int>::iterator it= v3.begin(); it!=v3.end(); it++)
{
cout << *it << " ";
}
cout << endl;
v3.insert(v3.end(),a,a+10); //v3尾部插入数组
for(vector<int>::iterator it= v3.begin(); it!=v3.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << "=============删除============" << endl;
v3.erase(v3.begin());
for(vector<int>::iterator it= v3.begin(); it!=v3.end(); it++)
{
cout << *it << " ";
}
cout << endl;
v3.erase(v3.begin(),v3.begin() + 9);
for(vector<int>::iterator it= v3.begin(); it!=v3.end(); it++)
{
cout << *it << " ";
}
cout << endl;
v3.clear(); //移除所有元素,清空容器
for(vector<int>::iterator it= v3.begin(); it!=v3.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
2.deque容器
deque是双端数组。deque可以随机存取元素,支持索引值直接存取,可用[]操作符或at()方法。在deque头部和尾部添加和移除元素都非常快速。但在中部添加和移除元素比较费时。
#include <iostream>
#include <deque>
using namespace std;
int main()
{
char ptr[] = "helloworld";
cout << "****构造、拷贝*****" << endl;
deque<char> d1;
deque<char> d2(10,'X');
deque<char> d3(ptr,ptr + strlen(ptr));
d1 = d2;
cout << "d1=";
for(deque<char>::iterator it = d1.begin(); it != d1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
for(int i=0; i<d3.size(); i++)
{
cout << d3[i] << " ";
}
cout << endl;
cout << "********交换*********" << endl;
d2.swap(d3);
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
for(int i=0; i<d3.size(); i++)
{
cout << d3[i] << " ";
}
cout << endl;
cout << "*******存取*******" << endl;
cout << d3[1] << endl;
cout << d3.at(2) << endl;
cout << "********插入******" << endl;
d2.push_back('y');
d2.push_front('y');
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
d2.insert(d2.begin(), 'Y');
d2.insert(d2.end(), 2, 'Y');
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
d2.insert(d2.begin(), ptr, ptr + strlen(ptr));
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << "*************删除***************" << endl;
d2.erase(d2.begin(),d2.begin() + 10);
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
d2.erase(d2.end() - 5, d2.end());
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
d2.resize(20,'Z'); //将元素量改为20 ,增加的元素为Z
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << "*****清空容器*****" << endl;
d2.clear();
for(deque<char>::iterator it = d2.begin(); it != d2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
删除元素
#include <iostream>
#include <deque>
using namespace std;
int main()
{
int a[] = {3,2,5,4,3,6,4,3,3,7,5,7,3,3,8};
deque<int> d1(a,a+ sizeof(a)/sizeof(a[0]));
for(deque<int>::iterator it = d1.begin(); it != d1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
for(deque<int>::iterator it = d1.begin(); it != d1.end();)
{
if(*it == 3)
{
it = d1.erase(it);
}
else
{
it++;
}
}
for(deque<int>::iterator it = d1.begin(); it != d1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
3.stack容器
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<int> s;
for(int i=0; i < 10; i++)
{
s.push(i +1);
}
cout << "s.top=" << s.top() << endl;
while( !s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
return 0;
}
4.queue容器
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
for(int i=0; i<10; i++)
{
q.push(i+1);
}
cout << "q.front=" << q.front() << endl;
cout << "q.back=" << q.back() << endl;
while( !q.empty())
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
return 0;
}
5.list容器
list是一个双向链表容器,可高效的进行插入删除元素。list不可以随机存取元素,所以不支持[]操作符和at()函数,也不支持迭代器的随机访问。
#include <iostream>
#include <list>
using namespace std;
void show(list<int> &l)
{
for(list<int>::iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
list<int> l;
for(int i=0; i<10; i++)
{
l.push_back(i);
}
l.push_front(2);
l.push_front(2);
l.push_front(2);
show(l);
cout << "元素个数:" << l.size() << endl;
show(l);
list<int>::iterator it = l.begin();
it++;
it++;
it++;
l.erase(it);
int a = 2;
l.remove(a);
show(l);
l.reverse();
show(l);
cout << "排序" << endl;
list<int> l1;
l.push_back(2);
l.push_back(1);
l.push_back(7);
l.push_back(4);
l.push_back(5);
l.sort();
for(list<int>::iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
list类操作:
#include <iostream>
#include <list>
using namespace std;
class Parent
{
private:
static int num;
int id;
string name;
string tel;
int age;
public:
Parent(string n, string t, int a);
void show();
};
int Parent::num = 0;
Parent::Parent(string n, string t, int a)
{
num++;
id = num;
name = n;
tel = t;
age = a;
}
void Parent::show()
{
cout << id << " " << name << " " << tel << " " << age << endl;
}
int main()
{
list<Parent> l;
Parent p1("aaa","111",20);
Parent p2("bbb","222",21);
Parent p3("ccc","333",22);
Parent p4("ddd","444",23);
Parent p5("eee","555",24);
Parent p6("fff","666",25);
l.push_back(p1);
l.push_back(p2);
l.push_back(p3);
l.push_front(p4);
l.pop_front();
l.insert(l.begin(),p5);
l.insert(++l.begin(),p6);
for(list<Parent>::iterator it = l.begin(); it != l.end(); it++)
{
it->show();
}
cout << "=====================" << endl;
l.reverse();
for(list<Parent>::iterator it = l.begin(); it != l.end(); it++)
{
it->show();
}
return 0;
}
6.map容器
map是标准的关联式容器,一个map就是一个键值对序列,即(key,value)对,它提供了基于key的快速检索能力。map中的key值是唯一的,集合中的元素按一定的顺序排序。元素插入过程是按排序规则插入,所以不能指定插入位置。map的具体实现是采用红黑树变体的平衡二叉树的数据结构,在插入操作和删除操作上比vector容器快。可以直接存取key所对应的value,支持[]操作符,如map[key] = value.
#include <iostream>
#include <map>
using namespace std;
int main()
{
cout << "*****插入 自动排序*****" << endl;
map<int,string> m1;
m1.insert(pair<int,string>(10,"小明"));
m1.insert(pair<int,string>(11,"小张"));
m1.insert(make_pair(2,"小王"));
m1.insert(make_pair(15,"小李"));
m1.insert(map<int,string>::value_type(4,"小赵"));
m1.insert(map<int,string>::value_type(8,"小吴"));
m1[17] = "小郑";
m1[16] = "小杨";
for(map<int,string>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << it->first << '\t' << it->second << endl;
}
cout << "**********查找**********" << endl;
map<int,string>::iterator it = m1.find(4);
if(it != m1.end())
{
cout << "找到id=" << it->first << ", 他的名字是:" << it->second << endl;
//it++; //加不加都可以
}
cout << "******返回键值等于key的元素区间*********" << endl;
pair<map<int,string>::iterator ,map<int,string>::iterator>ret = m1.equal_range(4);
if(ret.first != m1.end())
{
cout << "找到id=" << ret.first->first << ", 他的名字是:" << ret.first->second << endl;
}
if(ret.second != m1.end())
{
cout << "找到id=" << ret.second->first << ", 他的名字是: " << ret.second->second << endl;
}
cout << "*********删除**********" << endl;
m1.erase(10);
for(map<int,string>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << it->first << '\t' << it->second << endl;
}
return 0;
}
7.set容器
#include <iostream>
#include <set>
using namespace std;
class People
{
friend class Com;
private:
int id;
char name[32];
int age;
public:
People(int i, char *n, int a)
{
id = i;
strcpy(name, n);
age = a;
}
void show() const
{
cout << "id=" << id << ", name=" << name << ", age=" << age << endl;
}
bool operator<(const People &p) const
{
return this->id < p.id;
}
bool operator>(const People &p) const
{
return this->id > p.id;
}
};
class Com
{
public:
bool operator()(const People &p1, const People &p2) const //重载函数调用运算符
{
return p1.id > p2.id;
}
};
int main()
{
//set<int> s1; //默认从小到大排序
//set<int,less<int> > s1; //声明从小到大排序
set<int,greater<int> > s1; //声明从大到小排序
s1.insert(4);
s1.insert(0);
s1.insert(5);
s1.insert(8);
s1.insert(1);
for(set<int>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << "*************************" << endl;
People p1(1,"aaa",20);
People p2(7,"bbb",21);
People p3(4,"ccc",22);
People p4(9,"ddd",23);
People p5(6,"eee",24);
//set<People, less<People> > s2; //需要重载< 因为类People是自定义类型 从小到大排序
//set<People, greater<People> > s2; //需要重载> 因为类People是自定义类型 从大到小排序
multiset<People, Com> s2; //需要重载> 因为类People,Com是自定义类型 从大到小排序
s2.insert(p1);
s2.insert(p2);
s2.insert(p3);
s2.insert(p4);
s2.insert(p5);
//for(set<People, less<People> >::iterator it = s2.begin(); it != s2.end(); it++)
//for(set<People, greater<People> >::iterator it = s2.begin(); it != s2.end(); it++)
for(multiset<People, Com>::iterator it = s2.begin(); it != s2.end(); it++)
{
it->show();
}
cout << "********删除*******" << endl;
s1.erase(s1.begin());
for(set<int>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
s1.erase(s1.begin(), ++s1.begin());
for(set<int>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << "++++++++++++++++++++++" << endl;
s2.erase(p2); //按照id删除
for(set<People, less<People> >::iterator it = s2.begin(); it != s2.end(); it++)
{
it->show();
}
cout << "======================" << endl;
set<People,Com>::iterator it = s2.find(p5);
if(it == s2.end())
{
cout << "元素找不到" << endl;
}
else
{
it->show();
}
int num = s2.count(p4);
cout << "num=" << num << endl;;
cout << "***************" << endl;
it = s2.lower_bound(p3); //从大到小排序 返回第一个小于或等于p1的值(反之,若从小到大排序,则返回大于等于的值)
it->show();
cout << "***************" << endl;
it = s2.upper_bound(p3); //从大到小排序 返回第一个小于p1的值(反之,同上)
it->show();
cout << "*******组队*****" << endl;
pair< set<People,Com>::iterator, set<People,Com>::iterator > p; //从大到小排序
p = s2.equal_range(p3); //组队命令
p.first->show(); //输出p3
p.second->show(); //输出p3下一位
return 0;
}