1 创建方式
- std::vector<dataType> name; // 创建一个空的vector容器。
- std::vector<int> name {1, 2, 3, 4}; //创建容器的同时初始化容器数据类型和元素个数。
- std::vector<dataType> (len); // 创建容器的同时指定元素个数但不初始化。
- std::vector<dataType> (len,value); // 创建容器的同时指定元素个数为len,并将所有元素值初始化为value,其中value可以为常量也可以为变量表示。
- 复制存储类型相同的其他vector容器:
- std::vector<char>value1(5, 'c');
- std::vector<char>value2(value1); // 将value1中的元素赋值为value2
- 复制存储类型相同的其他vector容器指定范围的值:
- int array[]={1,2,3};
- std::vector<int>values(array, array+2);//values 将保存{1,2}
- std::vector<int>value1{1,2,3,4,5};
- std::vector<int>value2(std::begin(value1),std::begin(value1)+3);//value2保存{1,2,3}
使用reverse()成员函数重新定义vector容器容量时,其内存地址有可能会改变,所以其原有创建好的迭代器有可能会发生改变,使用时可以重新进行生成。
2 成员函数
表1 vector成员函数
| 函数成员 | 函数功能 |
|---|---|
| reserve() | 增加容器的容量。 |
| shrink _to_fit() | 将内存减少到等于当前元素实际所使用的大小。 |
| operator[ ] | 重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。 |
| at() | 使用经过边界检查的索引访问元素。 |
| front() | 返回第一个元素的引用。 |
| back() | 返回最后一个元素的引用。 |
| data() | 返回指向容器中第一个元素的指针。 |
| assign() | 用新元素替换原有内容。 |
| push_back() | 在序列的尾部添加一个元素。 |
| pop_back() | 移出序列尾部的元素。 |
| insert() | 在指定的位置插入一个或多个元素。 |
| erase() | 移出一个元素或一段元素。 |
| clear() | 移出所有的元素,容器大小变为 0。 |
| swap() | 交换两个容器的所有元素。 |
| emplace() | 在指定的位置直接生成一个元素。 |
| emplace_back() | 在序列尾部生成一个元素。 |
3 访问容器元素方式
(1)下标索引访问(vector中也提供了at()成员函数)。
(2)成员函数front()和back(),分别返回元素的引用。
(3)data() 成员函数,返回的是容器中首个元素的指针。
(4)迭代器访问。
(4) 使用基于范围的循环:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values{1,2,3,4,5};
for (auto&& value : values)
cout << value << " ";
return 0;
}
输出:
1 2 3 4 5 4.4 添加元素
(1)将元素添加在容器的尾部:
- push_back()
- emplace_back() C++11中新增的功能,实现的功能和push_back()一样。
区别:
使用push_back()时,会先创建这个元素,然后优先选择调用移动构造函数(第二选择拷贝构造函数),将该元素移动或者拷贝到容器中(拷贝的话会自行销毁之前创建的该元素),而emplace_back()会在该容器的尾部直接创建这个元素。
#include <vector>
#include <iostream>
using namespace std;
class testDemo
{
public:
testDemo(int num):num(num){
std::cout << "调用构造函数" << endl;
}
testDemo(const testDemo& other) :num(other.num) {
std::cout << "调用拷贝构造函数" << endl;
}
testDemo(testDemo&& other) :num(other.num) {
std::cout << "调用移动构造函数" << endl;
}
private:
int num;
};
int main()
{
cout << "emplace_back:" << endl;
std::vector<testDemo> demo1;
demo1.emplace_back(2);
cout << "push_back:" << endl;
std::vector<testDemo> demo2;
demo2.push_back(2);
}(2)容器指定位置插入元素
1 insert():
有四种对应的语法格式,返回的都是新插入第一个元素的位置。
#include <vector>
#include <iostream>
using namespace std;
int main()
{
std::vector<int> v1(10, 1);
std::vector<int> v2 {5, 5, 5};
// 1 iterator insert(pos,elem)——在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。
v1.insert(v1.begin(), 2);
// 2 iterator insert(pos,n,elem)——在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。
v1.insert(v1.begin()+1, 2, 3);
// 3 iterator insert(pos,first,last)——在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。
v1.insert(v1.begin(), v2.begin(), v2.end());
// 4 iterator insert(pos,initlist)——在迭代器 pos 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。
v1.insert(v1.begin(), {6, 6, 6, 6});
for(auto i=v1.begin(); i!=v1.end(); i++){
cout << *i << endl;
}
}
2 emplace
emplace() 是 C++ 11 标准新增加的成员函数,只能在vector容器的指定位置前插入一个的元素。
语法格式:
iterator emplace (const_iterator pos, args...); // 函数返回的时新插入元素位置的迭代器。
同上,emplace在插入元素时,也是直接在插入位置生成一个新的元素,而不是单独生成后再将其移动或者复制到容器中。
在vector容器中,访问、添加、插入元素都只能借助vector模板类中提供的成员函数,删除操作中除了成员函数外,还可以借助一些全局函数。
5 删除元素
表2 删除vector元素的几种方式。
| 函数 | 功能 |
|---|---|
| pop_back() | 删除 vector 容器中最后一个元素。(无返回值) |
| erase(pos) | 删除 vector 容器中 pos 迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器。 |
| erase(beg,end) | 删除 vector 容器中位于迭代器 [beg,end)指定区域内的所有元素,并返回指向被删除区域下一个位置元素的迭代器 |
| remove(first, last, elm) | 删除容器中所有和指定元素值相等的元素(定义在<algorithm>头文件中),并返回指向最后一个元素下一个位置的迭代器。值得一提的是,调用该函数不会改变容器的大小和容量。 |
| clear() | 删除 vector 容器中所有的元素,使其变成空的 vector 容器。 |
swap() 函数在头文件
<algorithm>和<utility>中都有定义,使用时引入其中一个即可。
关于remove的详细介绍在:
版权声明:本文为weixin_42542290原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。