C++——容器

一、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};//直接初始化
(6int 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>1sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列,可以通过重写排序比较函数按照降序比较2reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,13copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素4find(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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值