文章目录
前言
本文面向第一次接触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,24,3.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牺牲了空间换取便捷度与长度可变,所以在各大算法刷题网站上频频出现,掌握了基础语法,其实无大难度,言尽于此。