> 文章列表 > 【STL四】序列容器——vector容器

【STL四】序列容器——vector容器

【STL四】序列容器——vector容器

【STL容器】序列容器——vector容器

  • 一、简介
  • 二、头文件
  • 三、模板类
  • 四、成员函数
    • 1、迭代器
    • 2、元素访问
    • 3、容量
    • 4、修改操作
  • 五、demo
    • 1、容量reserve、capacity、shrink_to_fit
    • 2、修改操作pop_back()、push_back
    • 3、修改操作insert()
    • 4、修改操作emplace()
    • 5、修改操作erase()、swap()、clear() 、
    • 6、emplace_back()和push_back()的区别
    • 7、insert()和emplace()

一、简介

  • vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。

array实现的是一个静态数组。

  • vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。
    【STL四】序列容器——vector容器

二、头文件

#include<vector>

三、模板类

template<class T,class Allocator = std::allocator<T>
> class vector;

四、成员函数

1、迭代器

成员函数 功能
begin() 同array容器
end() 同array容器
rbegin() 同array容器
rend() 同array容器
cbegin() 同array容器
cend() 同array容器
crbegin() 同array容器
crend() 同array容器

2、元素访问

成员函数 功能
at(n) 同array容器
operator[] 同array容器
front() 同array容器
back() 同array容器
data() 同array容器

3、容量

成员函数 功能
empty() 同array容器
size() 同array容器
max_size() 同array容器
reserve 增加容器的容量。
capacity 返回当前容量。
shrink_to_fit 将内存减少到等于当前元素实际所使用的大小。

4、修改操作

成员函数 功能
clear() 移出所有的元素,容器大小变为 0。
insert() 在指定的位置插入一个或多个元素。
emplace() 在指定的位置直接生成一个元素。
erase() 移出一个元素或一段元素。
push_back() 在序列的尾部添加一个元素。
emplace_back() 在序列尾部生成一个元素。
pop_back() 移出序列尾部的元素。
resize() 调整容器的大小。
swap() 交换两个容器的所有元素。

五、demo

1、容量reserve、capacity、shrink_to_fit

//array 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; cout << "v.size()=" << v.size() << endl;cout << "v.capacity()=" << v.capacity() << endl<<endl;v.reserve(10);cout << "after reserve(10)" << endl;cout << "v.size()=" << v.size() << endl;cout << "v.capacity()=" << v.capacity() << endl<<endl;v.shrink_to_fit();cout << "after shrink_to_fit()" << endl;cout << "v.size()=" << v.size() << endl;cout << "v.capacity()=" << v.capacity() << endl << endl;return 0;
}

输出

v.size()=5
v.capacity()=5

after reserve(10)
v.size()=5
v.capacity()=10

after shrink_to_fit()
v.size()=5
v.capacity()=5

2、修改操作pop_back()、push_back

//vector 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; v.pop_back();v.push_back("six");for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;
}

输出

one two three four six

3、修改操作insert()

语法格式 用法说明
iterator insert(pos,elem) 在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。
iterator insert(pos,n,elem) 在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。
iterator insert(pos,first,last) 在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。
//vector 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; v.insert(v.begin(),"ten");for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;v.insert(v.end(), { "ten","ten2" });for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;return 0;
}

输出

ten one two three four five
ten one two three four five ten ten2

4、修改操作emplace()

是 C++ 11 标准新增加的成员函数,用于在 vector 容器指定位置之前插入一个新的元素。

  • emplace() 每次只能插入一个元素,而不是多个。

  • 该函数的语法格式如下:

iterator emplace (const_iterator pos, args…);

其中,pos 为指定插入位置的迭代器;args… 表示与新插入元素的构造函数相对应的多个参数;该函数会返回表示新插入元素位置的迭代器。

//vector 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; //emplace() 每次只能插入一个 int 类型元素v.emplace(v.begin(),"ten");for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;return 0;
}

输出

ten one two three four five

5、修改操作erase()、swap()、clear() 、

//vector 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; v.erase(v.begin());for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;vector<string> w{ "1","12" };v.swap(w);for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;v.clear();for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;return 0;
}

输出

two three four five
1 12
,

6、emplace_back()和push_back()的区别

  • 该函数是 C++ 11 新增加的,其功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素。
  • emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。

7、insert()和emplace()

  • 既然 emplace() 和 insert() 都能完成向 vector 容器中插入新元素,那么谁的运行效率更高呢?
    答案是 emplace()。

  • 假如,我们通过 insert() 函数向 vector 容器中插入 testDemo 类对象,需要调用类的构造函数和移动构造函数(或拷贝构造函数);而通过 emplace() 函数实现同样的功能,只需要调用构造函数即可。

同std::list、std::deque

#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;}testDemo& operator=(const testDemo& other);
private:int num;
};
testDemo& testDemo::operator=(const testDemo& other) {this->num = other.num;return *this;
}
int main()
{cout << "insert:" << endl;std::vector<testDemo> demo2{};demo2.insert(demo2.begin(), testDemo(1));cout << "emplace:" << endl;std::vector<testDemo> demo1{};demo1.emplace(demo1.begin(), 1);return 0;
}

输出

insert:
调用构造函数
调用移动构造函数
emplace:
调用构造函数

参考:
1、C++ STL 容器库 中文文档
2、STL教程:C++ STL快速入门
3、https://www.apiref.com/cpp-zh/cpp/header.html
4、https://en.cppreference.com/w/cpp/container