C++ vector 容器介绍
C++的vector是标准库中常见的一种容器,使用起来非常方便,可以用来代替c++原本的数组。vector是种容器,类似数组一样,但它的size可以动态改变。vector的元素在内存中连续排列,这一点跟数组一样。由于vector是标准库中的类,在使用vector的时候我们需要包含标准库的头文件 < vector > 。
如果vector的元素类型是int,默认初始化为0;如果vector元素类型为string,则默认初始化为空字符串。
向量(Vector)是序列/顺序容器(Sequence Containers),表示可以改变大小的数组。vector 是表示可变大小数组的序列容器。和数组一样,vector也采用的连续存储空间来存储元素,可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,它的大小会被容器自动处理。 vector在访问元素的时候高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率低。
与数组(arrays)一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的一样有效。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。
vector的文档https://c-cpp.com/cpp/container/vector.html
https://www.w3schools.cn/cpp_standard_library/vector.asp
实践文本内容需要支持c++ 11标准编译器。
创建vector对象
std::vector<int> vec1; // 空的vector,数据类型为int
std::vector<int> vec2(4); // 4个值为0的vector
std::vector<int> vec3 (4,10); // 第一个参数是数目,第二个参数是要初始化的值,即4个值为10的vector [10 10 10 10]
std::vector<int> vec4 (vec3.begin(),vec3.begin()+3); //初始值使用vec3的指定的区间元素 [10 10 10],注意,第0个到第2个(共3个)元素(不包括它begin()+3)
std::vector<int> vec5 (vec3); //初始值使用vec3的元素 [10 10 10 10]
std::vector<int> vec6 = {10, 20, 30, 40}; // [10 20 30 40]
【说明
命名空间(namespace)是C++语言特别重要的特性,当第三方供应商提供的库时,为了避免与其他供应商或者用户定义的名字相冲突(命名空间污染),常常将库的内容放置在自己独立的命名空间中。C++标准库也定义了相应命名空间std。
C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准函数库中的函数或对象都要使用std来限定。
但若在使用
using namespace std;
告诉编辑器我们将要使用空间std中的函数或者对象,可以省略std::,如:
#include<iostream>
//using namespace std;
int main()
{
std::cout<<"hello world"<<std::endl; //cout<<"hello world"<<endl;
return 0;
}
】
vector常用的成员函数
(1)size()
size()是最常用的成员函数了,常用于vector的遍历和元素个数的查询
(2)push_back()
出了初始化以外,push_back()是vector最重要的修改函数了,复杂度为O(1),而insert()的复杂度为O(n),差距明显
(3)front()、back()
查询首元素和未元素,其实通过随机访问,v[0]、v[v.size()-1]是可以达到相同效果的,用front()和back()显得专业点
(4)begin()、end()
通常用来方便排序的,也可以用来遍历,但没必要,通过下标遍历更简单快捷,rbegin()、rend()则可以用来逆序排序
(5)insert()
insert (position, x );
insert (position, n, x );
insert (position, first, last );
插入新的元素,
第一个函数,在迭代器指定的位置前插入值为x的元素
第二个函数,在迭代器指定的位置前插入n个值为x的元素
第三个函数,在迭代器指定的位置前插入另外一个容器的一段序列迭代器first到last
复杂度很高,若非迫不得已不使用
(6)erase()
erase ( position );
erase (first, last );
删除元素或一段序列
同样地,复杂度很高,若非迫不得已不使用
下面给出一个简单例子,演示上面给出部分成员函数的用法
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//初始化一个空vector容量
vector<char>value;
//向value容器中的尾部依次添加 S、T、L 字符
value.push_back('S');
value.push_back('T');
value.push_back('L');
//调用 size() 成员函数容器中的元素个数
printf("元素个数为:%d\n", value.size());
//使用迭代器遍历容器
for (auto i = value.begin(); i < value.end(); i++) {
cout << *i << " ";
}
cout << endl;
//向容器开头插入字符
value.insert(value.begin(), 'C');
cout << "首个元素为:" << value.at(0) << endl;
return 0;
}
运行结果如下:
元素个数为:3
S T L
首个元素为:C
下面的例子演示了如何使用 insert() 函数向 vector 容器中插入元素。
//vector容器中插入元素
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int main()
{
std::vector<int> demo{1,2};
//第一种格式用法
demo.insert(demo.begin() + 1, 3);//{1,3,2}
//第二种格式用法
demo.insert(demo.end(), 2, 5);//{1,3,2,5,5}
//第三种格式用法
std::array<int,3>test{ 7,8,9 };
demo.insert(demo.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9}
//第四种格式用法
demo.insert(demo.end(), { 10,11 });//{1,3,2,5,5,7,8,9,10,11}
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
return 0;
}
附录
C++ vector的用法(整理)https://www.cnblogs.com/Nonono-nw/p/3462183.html