文章目录
vector介绍
在C++语言的库中包含有公共数据结构的实现,C++的这个部分内容就是众所周知的STL(标准模版库),vector就是标准模板库中的数据结构之一。
vector常用的成员函数
有关vector定义的函数
函数声明 | 说明 |
---|---|
vector() | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
vector (const vector& x); | 拷贝构造 |
vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 |
无参构造
c
void test_vector1()
{
vector<int> v1();
}
构造n个val
c
void test_vector2()
{
vector<int> v2(10, 1);
}
拷贝构造
c
void test_vector3()
{
vector<int> v1{ 1,2,3,4 };
vector<int> v2 = v1;
for (int i = 0;i < v2.size();i++)
{
cout << v2[i] << ' ';
}
}
迭代器构造
c
void test_vector4()
{
vector<int> v1{ 1,2,3,4 };
vector<int> v2(v1.begin(), v1.end());
for (int i = 0;i < v2.size();i++)
{
cout << v2[i] << ' ';
}
}
vector的迭代器使用
iterator的使用 | 说明 |
---|---|
begin+end | 返回指向容器的第一项的一个适当的迭代器和返回指向终止标志的一个迭代器 |
rbegin+rend | 和begin和end类似,但是需要用reverse_iterator获取其迭代器 |
begin+end
使用场景:遍历容器
第一种遍历方式
c
void test_vector5()
{
vector<int> v1{ 1,2,3,4 };
vector<int>::iterator it = v1.begin();
while (it != v1.end())
{
cout << *it << ' ';
it++;
}
}
第二种遍历方式
c
void test_vector6()
{
vector<int> v1{ 1,2,3,4 };
for (vector<int>::iterator it = v1.begin();it != v1.end();it++)
{
cout << *it << ' ';
}
}
rbegin+rend
这里只展示一种遍历方式
c
void test_vector7()
{
vector<int> v1{ 1,2,3,4 };
vector<int>::reverse_iterator it = v1.rbegin();
while (it != v1.rend())
{
cout << *it << ' ';
it++;
}
}
剩下的还有什么const_iterator等等下来大家可以自己试试
vector关于空间操作的成员函数
成员函数 | 功能 |
---|---|
size | 返回数据个数 |
capacity | 返回空间大小 |
empty | 判断容器是否为空 |
resize | 改变容器的size大小 |
reverse | 改变容器的capacity大小 |
前面三个相信大家都会用了,所以这里直接从resize开始讲起,如果不懂的可以去看我讲解的string那节。
resize
resize函数改变的是size的大小
c
void test_vector8()
{
vector<int> v1{ 1,2,3,4 };
cout << v1.size() << endl;
v1.resize(10);
cout << v1.size() << endl;
}
如果这里默认不给参数的话,就会直接默认分配空间,并且把新开辟的空间初始化为0
c
void test_vector8()
{
vector<int> v1{ 1,2,3,4 };
cout << v1.size() << endl;
v1.resize(10, 3);
cout << v1.size() << endl;
for (int i = 0;i < v1.size();i++)
{
cout << v1[i] << ' ';
}
}
如果第二个给参数的话,剩下的空间就用第二个参数进行初始化
reverse函数
reverse和resize的用法相同。
但是需要注意的是:reverse的扩容的策略在每个平台下的每次的扩容量是不同的。
vs下capacity是按1.5倍增长的,g++是按2倍增长的。
vector的增删查改
push_back(尾插)
c
void test_vector9()
{
vector<int> v1{ 1,2,3,4 };
v1.push_back(1);
}
pop_back
c
void test_vector9()
{
vector<int> v1{ 1,2,3,4 };
v1.pop_back();
}
find(find函数并不是vector的成员函数,而是algorithm中的一个库函数)
c
void test_vector11()
{
vector<int> v1{ 1,2,3,4 };
vector<int>::iterator pos = find(v1.begin(), v1.end(), 1);
cout << *pos << endl;
}
注意:find的返回值是迭代器,不是返回下标,而是返回对应的数的迭代器
Insert
Insert也是与迭代器相关的一个成员函数
c
void test_vector12()
{
vector<int> v1{ 1,2,3,4 };
v1.insert(v1.begin(), 1);
}
erase
c
void test_vector13()
{
vector<int> v1{ 1,2,3,4 };
v1.erase(v1.begin());
}
erase可以删除一个数据,也可以删除多个数据
c
void test_vector13()
{
vector<int> v1{ 1,2,3,4 };
v1.erase(v1.begin(), v1.end());
}
上面的代码是erase删除一段数据的场景
operator[]重载
vector支持[]访问,我们可以像数组一样进行访问比如:
c
int main()
{
vector<int> v1{ 1,2,3,4,5,6,7,8,9 };
for (int i = 0;i < v1.size();i++)
{
cout << v1[i] << ' ';
}
return 0;
}
vector相较于数组的优势
在普通数组中不能进行复制操作,但是vector容器就支持复制操作,当我们需要复制一个容器的时候不需要用一个循环一个一个赋值,只需要用一个运算符重载=,就可以将容器中的值拷贝到另一个容器当中。
总结
在这篇关于"容器vector"的博客中,我们深入探讨了 C++ 中这个强大的数据结构。vector 提供了动态数组的功能,允许我们在运行时动态添加、删除元素,并且能够以常数时间复杂度访问元素,这使得它成为处理数据集合的理想选择。
我们了解了如何创建、初始化和操作 vector,以及如何使用其丰富的成员函数来满足各种需求。vector 的标准接口和异常安全性使得在处理数据时更加方便和安全。
通过学习本文,希望读者能够更加熟练地使用 vector,并且在实际项目中充分发挥它的优势。vector 不仅在算法和数据结构中有着广泛的应用,而且在各种类型的程序中都能发挥作用,从小型应用到大型系统都可以看到它的身影。
让我们继续深入学习和探索,掌握更多 C++ 中强大的工具和技术,不断提升自己的编程能力。感谢阅读!