1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C++学习笔记_15_vector简单用法

C++学习笔记_15_vector简单用法

时间:2020-01-04 17:20:25

相关推荐

C++学习笔记_15_vector简单用法

C++学习笔记_15_容器

官方文档在这看

文章目录

C++学习笔记_15_容器容器的选取一、vector是什么?二、vector构造函数三、vector的遍历方式四、容量空间五、vector增删查改补充1.在通过迭代器拷贝的时候,类型必须一致2.vector < string >3.vector< char > vstr4.习题链接

容器的选取

随机访问元素:Vector中间插入或删除:list、forword_list头尾插入删除,但不在中间插入删除:deque

如果不确定,尽量使用Vecotr

一、vector是什么?

按照官方文档的话说,vector是可变大小数组的序列容器,可以理解成一个类似于数组的形式,可以采用下标对vector的元素进行访问,但又不是数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

二、vector构造函数

vector的构造有一下几种:

vector<int> v1;//无参vector<int> v2(10, 3);//10个val,val==3vector<int> v3(v2);//拷贝构造vector<int> v4(v3.begin(), v3.end());//迭代器vector<int> v5(12345678);//不算

测试代码如下:

cout << "v1 : ";vector<int> v1;//无参for (size_t i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;cout << "v2 : ";vector<int> v2(10, 3);//10个val,val==3for (size_t i = 0; i < v2.size(); i++){cout << v2[i] << " ";}cout << endl;cout << "v3 : ";vector<int> v3(v2);for (size_t i = 0; i < v3.size(); i++){cout << v3[i] << " ";}cout << endl;cout << "v4 : ";vector<int> v4(v3.begin(), v3.end());for (size_t i = 0; i < v4.size(); i++){cout << v4[i] << " ";}cout << endl;//12个0cout << "v5 : ";vector<int> v5(12);for (size_t i = 0; i < v5.size(); i++){cout << v5[i] << " ";}cout << endl;

结果:

所以v5的方式不符合正常逻辑,因此不属于正常构造方式。

三、vector的遍历方式

与string类似:

for+operator[],在上面构造的时候已经使用过。迭代器

vector<int> v2(10, 3);vector<int>::iterator it2 = v2.begin();while (it2 != v2.end()){cout << *it2 << " ";++it2;}cout << endl;

3. 范围for

vector<int> v2(10, 3);for (auto v : v2)cout << v << " ";

代码简单,结果与前面一样。

推荐熟悉了以后,多用auto遍历。

四、容量空间

size返回数据个数capacity返回容量大小resize修改size大小reserve改变vector放入capacityempty判断是否为空

通过代码测试用法:

vector<int> v1(10,2);cout << "v1.size() = " << v1.size() << endl;cout << "v1.capacity() = " << v1.capacity()<< endl;v1.resize(5);cout << "v1.size() = " << v1.size() << endl;cout << "v1.capacity() = " << v1.capacity()<< endl;v1.reserve(15);cout << "v1.size() = " << v1.size() << endl;cout << "v1.capacity() = " << v1.capacity()<< endl;cout<<v1.empty()<<endl;

开10个空间,每个放入2,此时size、capacity都是10;resize之后,size改变,capacity不变;reserve之后,size不变,capacity改变;

结果:

小测试说明vector的容量变化:

size_t sz;std::vector<int> v;sz = v.capacity();std::cout << "making v grow:\n";for (int i = 0; i < 100; ++i) {v.push_back(i);if (sz != v.capacity()) {sz = v.capacity();std::cout << "capacity changed: " << sz << '\n';}}return 0;

证明在VS中约1.5倍扩容,g++中约2倍

五、vector增删查改

push_back 尾插pop_back 尾删find 查找insert 在pos之前插入valerase 删除pos上的valswap 交换数据空间operator[] 像数组一样访问

测试代码:

int main(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);v.push_back(7);v.push_back(8);for (auto s : v){cout << s << " ";}cout << endl;v.pop_back();v.pop_back();for (auto s : v){cout << s << " ";}cout << endl;vector<int>::iterator pos = find(v.begin(), v.end(), 3);v.insert(pos, 9);vector<int>::iterator it = v.begin();while (it != v.end()) {cout << *it << " ";++it;}cout << endl;pos = find(v.begin(), v.end(), 4);// 删除pos位置的数据v.erase(pos);it = v.begin();while (it != v.end()) {cout << *it << " ";++it;}cout << endl;return 0;}

补充

1.在通过迭代器拷贝的时候,类型必须一致

list<int> lt(5, 3);vector<int> v4(lt.begin(), lt.end());

2.vector < string >

为什么使用&(引用)和const

vector<string> v;v.push_back("kris");v.push_back("zgz");///for (auto s : v){cout << s << " ";}cout << endl;*///不断存在深拷贝//解决for (const auto & s : v){cout << s << " ";}cout << endl;vector<vector<string>> vv;//在这体现更明显

3.vector< char > vstr

vector<char> vstr;string str;

区别:

string更好配合,如:strcpy(buff, str.c_str());支持:+=、 比较大小等

4.习题链接

1.只出现一次的数字

2.杨辉三角

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。