作为初学者,为vector做一些浅显、简洁的总结;
1 定义:
vector, 可以封装各种数据类型(数值、字符、布尔或vector本身)的动态可变的顺序容器。
显然三个优点,
- 1)顺序存储便于遍历访问;
- 2)可以封装各种类型,比数组要灵活的多;
- 3)动态数组:不像数组,可以扩容(一般都是初定一个容量、达到70%容量自动触发扩容机制)。
C++容器 新建、遍历、排序、二维vector、判空
操作 | 示例 |
---|---|
新建 | - vector vi; 创建空vector,最常用; |
Vectorvi (int nSize); | |
Vectorvi (int, const int); | |
Int ai[]={0,1,2,3,4}, Vectorvi(& a[1], & a[4]); 建立一个vector,元素从另外一个数组中复制[begin,end) 部分,注意两个参量均是引用类型; | |
遍历 | 顺序访问:int ai[]={10,11,12,13,14,15, 16,17,18,19}; // vector<int> vi(&ai[2],&ai[9]); // for(int i=0; i<vi.size(); i++){cout<<vi[i]<<","; } |
模仿stack | 压入 vi.push_back(int) 顶上弹出(注意不会输出值): // vi.pop_back(int) |
判空 | vi.empty(); // 空则输出1, 否则输出0; |
排序 | sort(vi.begin(),vi.end()); //升序; |
降序排序 | bool compare(int a,int b) return a> b; sort(vi.begin(),vi.end(),compare) 通过自定义比较器compare; |
二维: 新建、输出:都相当于2维数组,组层构建即可;
vector<vector<int> > vi2D;
int ai[]={0,1,2,3,4};
vector<int> vi(&ai[0],&ai[5]);
for(int i=0; i<2;i++){
vi2D.push_back(vi);
}
for(int i=0;i<vi2D.size();i++)
{
for(int j=0;j<vi2D[i].size();j++)
cout<<vi2D[i][j]<<",";
cout<<endl;
}
迭代器:
一维:
vector<int>::iterator p;
for(p = vi.begin(); p < vi.end(); p++){
cout<<*p<<",";
}
(注意,所有类型的一维迭代器都是一样的。一通百通,只需要修改vector中封装类型即可)
二维
vector<int >::iterator it;
for(int i=0;i<vi2D.size();i++)
{
for(it=vi2D[i].begin();it<vi2D[i].end();it++)
cout<<*it<<",";
cout<<endl;
}
迭代器:
顺序容器很重要的思想,所有的顺序容器(如string)都可以用iterator以相似的语句实现
定义方法为vector:: iterator it; 看起来复杂,其实类似于for循环中,我们定义的局域int i = 0;那个 指示器。这里迭代器其实是个引用,故没有类型区分(引用跨的间隔取决于vector中所定义的类型);
示例
1降序排序:
#include <iostream>
#include <vector>
#include<string.h>
#include<algorithm>
using namespace std;
bool compare(int a,int b){
return a>b;
}
int main() {
int ai[]={10,11,12,13,14,15,16,17,18,19};
vector<int> vi(&ai[2],&ai[9]);
for(int i=0; i<5; i++){
vi.push_back(i);
}
for(int i=0; i<vi.size(); i++){
cout<<vi[i]<<",";
}
cout<<endl;
//sort(vi.begin(),vi.end());
sort(vi.begin(),vi.end(),compare);
for(int i=0;i<vi.size();i++)
{
cout<<vi[i]<<",";
}
cout<<endl<<vi.empty()<<endl<<vi.size();
cout << "test\n";
return 0;
}
2 迭代器遍历:
#include <iostream>
#include <vector>
#include<string.h>
#include<algorithm>
using namespace std;
bool compare(int a,int b){
return a>b;
}
int main() {
vector<vector<int> > vi2D;
int ai[]={0,1,2,3,4};
vector<int> vi(&ai[0],&ai[5]);
for(int i=0; i<2;i++){
vi2D.push_back(vi);
}
cout<<"Using array index method"<<endl;
for(int i=0;i<vi2D.size();i++)
{
for(int j=0;j<vi2D[i].size();j++)
cout<<vi2D[i][j]<<",";
cout<<endl;
}
cout<<"Using iterator to ouput"<<endl;
vector<int >::iterator it;
for(int i=0;i<vi2D.size();i++)
{
for(it=vi2D[i].begin();it<vi2D[i].end();it++)
cout<<*it<<",";
cout<<endl;
}
cout<<endl<<vi.empty()<<endl<<vi2D.size()<<endl;
cout << "perfey\n";
return 0;
}
使用resize()构造 非对称的数组;非常强大
#include <iostream>
#include <vector>
#include<string.h>
#include<algorithm>
using namespace std;
bool compare(int a,int b){
return a>b;
}
int main() {
vector<vector<char> >vc2D(8);
cout<<"using powerful resize()"<<endl;
vc2D[0].resize(3);
vc2D[0][0]='a';
vc2D[0][1]='b';
vc2D[0][2]='c';
vc2D[1].resize(4);
vc2D[1][0]='d';
vc2D[1][1]='e';
vc2D[1][2]='f';
vc2D[1][3]='g';
vc2D[2].resize(8);
vc2D[2][0]='h';
vc2D[2][1]='i';
vc2D[2][2]='j';
vc2D[2][3]='k';
vc2D[2][4]='h';
vc2D[2][5]='i';
vc2D[2][6]='j';
vc2D[2][7]='k';
vector<char>::iterator it;
for(int i=0;i<vc2D.size();i++){
for(it=vc2D[i].begin();it<vc2D[i].end();it++){
cout<<*it<<",";
}
cout<<endl;
}
cout<<endl<<vc2D.empty()<<endl<<vc2D.size()<<endl;
cout << "perfey\n";
return 0;
}