一、Vector
1.初始化
(1)vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),元素都为0。
(2)vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
(3)vector<int> a(b); //用b向量来创建a向量,整体复制性赋值
(4)vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
(5)vector<int> a={1,2,3,4,5};//直接初始化
(6)int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+7); //从数组中获得初值
2.基本操作
(1)创建vector对象,vector<int> vec;
(2)vec.empty()若不含元素返回真,否则返回假
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();但是即使clear(),vector所占用的内存空间依然如故,所有内存空间是在vector析构时候才能被系统回收。
3.常用操作
(1)遍历
vector<int> vec={0,1,2,3,4,5,6,7,8,9};
for(auto &r:v)//循环控制变量r与vec关联在一起,要修改元素值,r声明为引用类型
r*=2;
//等价于传统迭代器
for(auto beg=vec.begin(),end=vec.end();beg!=end;++beg){
auto &r=*beg;
r*=2;
}
(2)添加元素
//利用迭代器从已有向量中选取元素添加,如果是数组或是普通vector可以直接利用下标访问
int a[6]={1,2,3,4,5,6};
vector<int> b;
vector<int> c(a,a+4);
for(vector<int>::iterator it=c.begin();it<c.end();it++)
b.push_back(*it);
(3)常用算法
#include<algorithm>
(1)sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列,可以通过重写排序比较函数按照降序比较
(2)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
4.补充:用vector实现二维数组
法一:
vector<vector<int> > array(m);
//初始化一个m*n的二维数组,全为0
for(int i=0;i<m;i++) {
array[i].resize(n);
}
//实际上是下面这个
vector<vector<int> > vec(2);
for(int i=0;i<2;i++) {
//vec[i].resize(3);
for(int j=0;j<3;++j){
vec[i].push_back(0);
}
}
法二:
vector<int> temp(n); //先创建一个含有n个元素的一维数组,代表列
vector<vector<int>> matrix(m,temp); //再根据穿件m个含有n个元素的一维数组构成的二维数组
二、Map(key-value)和Set
详见C++primer——关联容器
例1:单词计数
map<string, int> word_count; // empty map from string to int
//这个maps是无序的,按照键的首字母排序,如果按照值的大小排序应该用unordered_map
string word;
while (cin >> word)
if (word=="ok")
break;
else
++word_count[word];
for (const auto &w : word_count)
cout << w.first << " occurs " << w.second << " times" << endl;
//map使用insert时元素必须是pair类型的
例2
vector<int> vec;
for(int i=0;i!=10;++i)
{
vec.push_back(i);
vec.push_back(i);
}
set<int> iset(vec.begin(),vec.end());//10个元素
multiset<int>miset(vec.begin(),vec.end());//20个元素
map<int,int>map;//10个元素
for(auto & v:vec) {
++map[v];
}
return 0;