Vector等容器初始化与相关操作

本文主要根据一些帖子与自己的实际经验总结而来,供大家参考

一.vector初始化

1 一维数组初始化

(1)不带参数的构造函数初始化

//初始化一个size为0的vector
vector<int> abc;

(2)带参数的构造函数初始化

将vector初始化为size大小,每个元素值为默认值

//初始化了10个默认值为0的元素
vector<int> abc(10);

注意:与自己定义的类和结构体中的struct st m=new st(10);的初始化是不同的,这里结构体用的是结构体中的构造函数进行初始化,也就是结构体遍历默认值是10,而没有初始化为10个。

下面初始化为size个具有初始值的vector

//初始化了10个值为1的元素
vector<int> cde(10,1); 

(3)通过数组地址初始化

//通过数组a的地址初始化,注意地址是从0到5(左闭右开区间)
int a[5] = {1,2,3,4,5};
vector<int> b(a, a+5);

以下直接用列表初始化

vector<int> ilist = {1,2,3.0,4,5,6,7};
//或
vector<int> ilist {1,2,3.0,4,5,6,7};

ilist初始化为列表中元素的拷贝,列表中元素必须与ilist的元素类型相容,本例中必须是与整数类型相容的类型,整型会直接拷贝,其他类型会进行类型转换。

(4)通过同类型的vector初始化

vector<int> a(5,1);
//通过a初始化
vector<int> b(a);

(5)通过insert初始化

//insert初始化将同类型的迭代器对应的始末区间(左闭右开区间)内的值插入到vector中
vector<int> a(6,6);vector<int> b;
//将a[0]~a[2]插入到b中,b.size()由0变为3
b.insert(b.begin(), a.begin(), a.begin() + 3);
//insert也可通过数组地址区间实现插入
int a[6] = {6,6,6,6,6,6};
vector<int> b;
//将a的所有元素插入到b中
b.insert(b.begin(), a, a+7);
//此外,insert还可以插入m个值为n的元素//在b开始位置处插入6个5
b.insert(b.begin(), 6, 5);

(6)通过copy函数赋值

vector<int> a(5,1);
int a1[5] = {2,2,2,2,2};
vector<int> b(10);
/*将a中元素全部拷贝到b开始的位置中,注意拷贝的区间为a.begin() ~ a.end()的左闭右开的区间*/
copy(a.begin(), a.end(), b.begin());
//拷贝区间也可以是数组地址构成的区间
copy(a1, a1+5, b.begin() + 5);

2 二维数组初始化

1.直接通过数组地址

vector<vector<int>> array={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};

2 vector用花括号{}的初始方式

vector< vector<int> > array( 10, vector<int>(0) );

上面的意思是二维的动态数组,有10行,每一行是一个存储这一行数据的vector。所以每一行的长度是可以变化的。

之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。

1.对array.size()来说是行数的含义

2.对array[i].size()来说是i行元素的个数

//注意下面这一行:vector<int后两个">"之间要有空格!否则会被认为是重载">>"
vector<vector<vector<int> > >vecInt(m, vector<vector<int> >(n,vector<int>(l)));//m行n列

3 使用new创建vector类型的数组

1.为指针分配内存

//这里的vectors并不是1个vector,而是有n个vector,即创建了n个vector
vector<int>* vectors = new vector<int>[n];

输入元素:vectors[i].push_back(data);

例:

vector<int> *vec=new vector<int>(10,0);
cout<<vec->at(5)<<endl;
delete vec;

2.为变量分配内存

//创建一个向量类对象v,有100个元素的空间,若空间使用完时,以50个元素空间单位递增。
vector v = new vector("100",50);

二.vector一些操作

1 vector擦除

1.myvector.clear(); //移除容器中的所有元素

删除容器中所有的元素(被销毁),留下大小为0的容器。

vector::clear()函数的作用是清空容器中的内容,但如果是指针对象的话,并不能清空其内容,必须要像以下方法一样才能达到清空指针对象的内容:

vector<int*> xx;
for(int it=0;it!=xx.size();++it){
delete xx[it];
}
xx.clear();

但并不回收内存,但你可以通过swap()函数来巧妙的达到回收内存的效果:

xx.clear();

xx.swap(vector<int>());

2.myvector.erase (myvector.begin(),myvector.begin()+3);

从容器中移除单个元素(位置)或一段元素([first,last))

vector::erase()用于清空容器中的内容以及释放内存,并返回指向删除元素的下一个元素的迭代器。

3.删除容器c中最后一个数据。

c.pop_back()

2 容器大小修改

1.myvector.resize(8,100);

调整容器的大小,使其包含n个元素。

如果n小于当前的容器大小,则容器内容被缩减为其前n个元素,将其其他元素删除(并销毁它们)

如果n大于当前容器大小,则通过在末尾插入尽可能多的元素来扩展内容以达到n的大小。 如果指定val,则将新元素初始化为val的副本,否则将进行值初始化。

如果n也大于当前容器容量,则会自动重新分配分配的存储空间。

请注意,此函数通过插入或删除容器中的元素来更改容器的实际内容。

3 容器元素插入

1.myvector.emplace_back (100);

C++11中加入的新特性,emplace_back能通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。

所有的标准库容器(array除外,因为它的长度不可改变,不能插入元素)都增加了类似的方法:emplace、emplace_hint、emplace_front、emplace_after、emplace_back等

2.auto it = myvector.emplace ( myvector.begin()+1, 100 );

emplace使得在指定位置插入一个元素100

4 交换两个Vector

swap()

5 c.at(idx)

传回容器索引idx所指的数据,如果idx越界,抛出out_of_range。

即数组c[idx];

6 c.max_size()

返回容器中最大数据的数量。

猜你喜欢

转载自blog.csdn.net/u011795345/article/details/82356715