C++ Primer(第五版)学习笔记_2_标准模板库vector(1)
向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组。
值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间。
容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的。不一样的是,vector可以随时调整其大小。
vector重要的方法有三个:使用push_back()方法从尾部扩张元素;使用insert()方法在某个元素位置前插入新元素;使用size()方法返回容器的大小;使用begin()返回首元素位置的迭代器;使用end()返回最后一个元素的下一个元素位置的迭代器。需要注意的是,在STL中应该善用迭代器iterator,不能受数组下标思想的限制。
向量的元素类型可以是int,double,char等简单类型;也可以是结构体或string基本字符序列容器等。
1、创建vector对象
创建vector对象常用的有三种形式:
(1)不指定容器的元素个数:
vector<int>v;
(2)创建时,指定容器的大小,如定义存储10个double元素的向量容器。
vector<double>v(10); //每个元素都被初始化为0.0
(3)创建一个具有10个元素的向量容器,每个元素都有指定的初始值8.6。
vector<double>v(10, 8.6);
vector<int>v({1, 2}); //创建一个包含1,2的向量
vector<int>v(v1.begin(), v1.end()); //将v1复制到向量v中
(4)v.reserve(k)表示容器预留k个空间容量即capacity(指容器在分配新的存储空间之前能存储的元素总数),但并不是真正的创建对象,需要通过insert()或push_back()等创建对象。
(5)v.resize(k)既分配了空间,也创建了对象。用法类似于(2),v.resize(10),每个元素都被初始化为0.0,对v重新分配空间。
结论:reserve只修改capacity大小,不修改size大小,resize既修改capacity大小,也修改size大小。
#include<iostream> #include<vector> usingnamespace std; int main(intargc, char* argv[]) { vector<int> num; cout << "初始的capacity:" << num.capacity() <<endl; cout << "初始的size:" << num.size() << endl; num.reserve(10); cout << "num的capacity:" << num.capacity() <<endl; cout << "num的size:" << num.size() << endl; num.resize(20); cout << "num的capacity:" << num.capacity() <<endl; cout << "num的size:" << num.size() << endl; return 0; }
运行结果:
初始的capacity:0
初始的size:0
num的capacity:10
num的size:0
num的capacity:20
num的size:20
(6)通过assign()方法,可以重新赋值新元素到vector向量容器中,并且会清除旧的vector容器中的内容。用法类似于(3)。
v.assign(10,8.6);
v.assign({1,2}); //创建一个包含1,2的向量
v.assign(v1.begin(),v1.end()); //将v1复制到向量v中
2、尾部元素扩张
通常使用push_back()对vector容器在尾部追加新元素。vector容器会自动分配新内存空间。既可以对空的vector对象扩张,也可以对已有元素的vector对象扩张。
下面代码将2,7,9三个元素从尾部添加到num容器中,这样num容器中就有三个元素,其值依次是2,7,9。
#include <iostream> #include <vector> using namespace std; int main(int argc, char* argv[]) { vector<int> num; num.push_back(2); num.push_back(7); num.push_back(9); return 0; }
3、下标方式访问vector元素
访问或遍历vector对象是常要做的事情。对于vector对象,可以采用下标方式随意访问某个元素,也可以采用下标方式对某个元素重新赋值,这点类似于数组的访问方式。
#include <iostream> #include <vector> using namespace std; int main(int argc, char* argv[]) { vector<int> num; num.push_back(2); num.push_back(7); num.push_back(9); for(int i = 0; i < num.size(); i++) cout << num[i] <<" "; cout << endl; return 0; }
运行结果:
2 7 9
4、用下标方式赋值,当已经超过vector容器的大小时,就不能用下标容器赋值了。但此时,还可以用push_back()方法赋值。
#include <iostream> #include <vector> using namespace std; int main(int argc, char* argv[]) { vector<int> num(3); num[0] = 2; num[1] = 7; num[2] = 9; num.push_back(11); for(int i = 0; i < num.size(); i++) cout << num[i] <<" "; cout << endl; return 0; }
运行结果
2 7 9 11
5、使用迭代器访问vector元素
使用迭代器iterator对vector对象进行遍历访问,迭代器类型一定要与它所遍历的vector对象的元素类型一致。
#include <iostream> #include <vector> using namespace std; int main(int argc, char* argv[]) { vector<int> num; num.push_back(2); num.push_back(7); num.push_back(9); for(vector<int>::iterator iter = num.begin(); iter !=num.end(); iter++) cout << *iter << " " ; cout << endl; return 0; }
运行结果:
2 7 9
版权声明:本文为博主原创文章,未经博主允许不得转载。
C++ Primer(第五版)学习笔记_2_标准模板库vector(1)
原文地址:http://blog.csdn.net/keyyuanxin/article/details/46790339