C++ vector 的相关基本操作
2016-11-08 20:48
330 查看
vector容器的基本操作
这篇博客主要讲一下vector的基本操作,比如,初始化,push_back, pop_back,empty,clear,operator[] 等。这些东西基本上每本书上都有,是比较基础的知识。初始化 vector
vector初始化的方法比较多,我这里讲5种,至于是不是有更多种我也不太确定(不包括C++11标准)。第一种最简单的初始化:
vector<int> one; //初始化一个空的vector容器,one.size() 结果为0
第二种初始化,指定元素个数和初始化的值:
vector<int> two(10,90)//初始化一个vector<int> 变量two,有10个元素,每个元素为90
如果不指定第二个参数,编译器会自动初始化初始值:
vector<int> two (10) //初始化一个vector<int> 变量two,有10个元素,每个元素为0
第三种初始化,使用迭代器初始化:
vector<int> three(two.begin(), two,end());
第四种初始化,复制初始化:
vector<int> four (three);
直接将three复制给four
第五种初始化,使用数组初始化:
int mynum [] = {11, 22, 33, 44}; vector<int> five(mynum. mynum + 1); //five有1个元素11 vector<int> five(mynum, mynum + 4); //five有4个元素,11,22,33,44 vector<int> five(mynum, mynum + 0); //会报错
vector的push_back和pop_back方法
push_back()是在vector的末尾添加新的元素,而pop_back()则是在vetor的末尾删除元素;vector<int> b; b.push_back(11); b.push_back(22); b.push_back(33); b.push_back(44); for (vector<int>::iterator iter = b.begin(); iter != b.end(); iter++) { cout << *iter << endl; }
以上结果为:
11
22
33
44
然后我们使用pop_back()方法:
b.pop_back(); b.pop_back(); for (vector<int>::iterator iter = b.begin(); iter != b.end(); iter++) { cout << *iter << endl; }
结果为
11
22
vector的capacity()方法
这个方法和size不一样,返回值和size也不同,有时候会比元素个数还多,这是怎么回事呢?我想举个简单的例子来说明动态数组是怎么实现的。然后大家就知道capacity是什么了。因为C语言里面没有动态数组,而在C++里面实现了动态数组,那么我如果想要在C语言里面实现动态数组怎么办呢?我们可以使用一个很简单的实现思路。先声明一个大小为n的C数组,然后等到数组满了的时候,我们重新声明一个大小为2n的C数组,然后把第一个大小为n的数组里的元素都复制到新的大小为2n的数组里,这样就实现了一个简单的动态数组。
C++里的动态数组实现的大致思路也是一样的,上面举得例子中,我们当每次数组满的时候,就将数组扩大2倍,但是vector里不一定是这个规则,有可能是数组有十分之七被占满了,就会重新申请一个新的数组,新的数组大小也不一定正好是2倍,有可能是1.5倍之类的。所以,这个capacity就是重新申请的数组的大小。具体STL里如何实现的,我也没有看过源码,我怀疑可能不同的STL有不同的实现。
vector的operator[]和at方法
operator[]是为了兼容c语言的数组,重载了[]运算符,让我们可以像数组一样,用[]访问vector容器的元素,比如 cout << b[0] << endl; 结果就是11; 和at方法不同的是,[]运算符不进行越界检查,而at进行越界检查,也就是说b.at(1000)会在运行时报错,而b[1000]就不一定了。
operator[]还有一个用法,就是我们声明一个vector类型的指针的时候,可以使用这个方法来根据下标访问某个元素:
vector<int> *aa; vector<int> b; aa = &b; aa->push_back(11); aa->push_back(41); //cout << "--------" << endl; cout << aa->size() << endl; cout << (*aa)[1] << endl; //将aa使用解引用运算符转换成vector变量,再使用[]访问 cout << aa->operator[] (1) << endl; //直接用operator[] (1)来访问第1个元素
目前我也不清楚这两个方法,哪个更好一点。
vector的size和empty方法
这两个方法十分简单,size就是返回vector里元素个数的,注意和capacity方法区别,然后empty方法是用来确定该vector是否为空。具体代码我就不给了,随便一本书上都有。相关文章推荐
- C++ vector基本操作学习
- C/C++基础——vector的基本操作总结
- C++ STL之vector容器的基本操作
- Vector c++ 的基本操作 矢量 *_* !
- 二叉树的基本操作以及相关问题的求解—C++实现
- 【c++】vector容器&set容器的基本操作
- C++中vector 容器的基本操作
- C/C++基础——vector的基本操作总结
- c++中stack、queue和vector的基本操作示例
- C++ 中Vector常用基本操作
- C++中vector的基本操作
- c++ 容器vector的基本操作
- C++ Vector的基本操作和使用
- C++中vector向量的基本操作
- 函数和Vector相关基本操作
- C++【container】 vector基本操作
- c++中的字符串基本操作
- C++大整数相关操作
- C++ map的基本操作和用法
- C++ 二叉树的基本操作