您的位置:首页 > 编程语言 > C语言/C++

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是否为空。具体代码我就不给了,随便一本书上都有。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: