C++ Vector 操作

本文详细介绍了C++中的Vector容器,对比了它与普通数组的区别,如动态调整大小、使用迭代器等。讲解了Vector的初始化、遍历、添加和删除元素等常见操作,并提醒了在使用过程中应注意的细节问题,旨在帮助初学者快速掌握Vector的基础知识。
摘要由CSDN通过智能技术生成


前言

本文面向第一次接触Vector的完全新手


一、Vector与普通数组的区别

1.优点

1.在删除数组元素的时候可以删除空间,增加元素可以增加空间
2.数组大小可变

2.缺点

1.在数组利用下标直接更改元素值时,Vector只能使用迭代器(相当于指针)或删除+添加操作来实现更改

3.其他

vector是类模板,所以在使用时可为值指定不同的数据类型,每个数据类型也有他专属的迭代器(类似指针)

二、常用操作

0.调用的成员变量

迭代器iterator

Vector<char> b(7't');
vector<char>::iterator it1;//迭代器的定义
Vector<char> b(7);
b.begin();//b的首元素迭代器
b.end();//b的尾元素迭代器
it1=b.begin();//迭代器的使用
it1+=3;//类似指针,改变指向的元素

b.front();//b的首元素引用
b.back();//b的尾元素引用

b.size();//元素个数
v.empty();//如果为空,返回true,非空返回false

1.初始化

1)值

定义了10个整型元素的向量,<>内为该容器值的数据类型,初值不确定

vector<int> a(5); 

定义了10个整型元素的向量,且给出每个元素的初值为1

vector<int> a(10, 1);

2)数组

已知数组给容器赋值

int a[7] = { 1,2,3,4,5,6,7 };
vector<int> v(a, a + 7); //7为容器的元素个数

3)Vector

用其他容器整体赋初始值

Vector<double> v(8,3.14);
Vector<double> x(v);

选取其他容器部分元素赋初始值
注意:此时容器内只有x个元素
可以理解为用[begin(),begin()+2)的元素来赋值

int x=2;
Vector<double> x(v.begin(), v.begin + x); 

2.遍历

两种方式

1)迭代器

vector<int> v(8,1);//v有8个元素,每个元素的初值为1
for (Vector<int> it = v.begin(); it != v.end(); it++)
		cout << *it << "  ";

用来方便的改变元素值

2)下标(不推荐)

有些数据类型不支持下标表示,故不为主流

vector<int> v(8,1);//v有8个元素,每个元素的初值为1
for(int i=0;i<v.end();i++){
	cout << v[i] << "  ";
}

PS:与数组不同,下标只用来提供值,不能被赋值(与java、C# in循环类似)

3.已知位置求值

vector<double>::iterator it =v.begin();
int x = 3;
cout << *(it + x);//求得v的第x-1个元素(下标为x)

4.添加元素

1)push_back与emplace_back()

在容器末尾添加元素 push_back
C++11中添加了emplace_back(),两者使用方法无区别
区别:push_back() 首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中;而 emplace_back() 直接在容器尾部创建这个元素。效率高

vector<int> v(7);
v.push_back(5);
v.push_back(int(3.56));

2) insert

iterator insert( iterator loc, const TYPE &val );
在指定元素前插入元素:要符合数据类型,但高位可以向低位强制类型转换

vector<int> v(8,1);//v有8个元素,每个元素的初值为1
vector<int>::iterator it =v.begin();
v+=3;
v.insert(v,3);//

void insert( iterator loc, size_type num, const TYPE &val );
在loc指向的元素前插入num个元素,值为val

vector<int> v(8,1);//v有8个元素,每个元素的初值为1
vector<int>::iterator it =v.begin();
v+=3;
v.insert(v,243.786);//插入24个3

void insert( iterator loc, input_iterator start, input_iterator end );
向loc后插入从[*v1.start(),*v1.end())的元素。

v2.insert(v2.end(), v1.begin(), v1.end()-1);

5.删除元素-erase

iterator erase(iterator position);

  • 错误:返回值为被删除元素的下一个元素迭代器,因为下一个元素回填到被删除的位置造成的错觉 其实是仍然指向被删除元素位置
  • 危险:如果删除最后一个元素,返回值就成为野指针

iterator erase(iterator first, iterator last);

  • 危险:在删除元素段之后,迭代器的位置并未改变,最保险的利用方式是it–,返回到指向删除元素段上一个元素。
vector<char>::iterator it1;
vector<char>::iterator it2;
it2 = v2.begin()+3;
it1=erase(it2));


it2 = v2.begin();
iter2=(v2.erase(iter2+1,iter2+3));

三、总结

Vector牺牲了空间换取便捷度与长度可变,所以在各大算法刷题网站上频频出现,掌握了基础语法,其实无大难度,言尽于此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值