STL - vector

C++ STL中的verctor好比是C语言中的数组,但是vector又具有数组没有的一些高级功能。与数组相比,vector就是一个可以不用再初始化就必须制定大小的边长数组,当然了,它还有许多高级功能。

1.头文件

#include <vector>

2.初始化

如果vector的元素类型是int,默认初始化为0;如果vector元素类型为string,则默认初始化为空字符串。

vector<int> v1;
vector<father> v2;
vector<string> v3;
vector<vector<int> >;  //注意空格。这里相当于二维数组int a[n][n];
vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号
vector<string> v6 = { "hi","my","name","is","lee" };
vector<int> v7(5, -1); //初始化为-1,-1,-1,-1,-1。第一个参数是数目,第二个参数是要初始化的值
vector<string> v8(3, "hi");
vector<int> v9(10); //默认初始化为0
vector<int> v10(4); //默认初始化为空字符串

3.添加元素

请使用push_back加入元素,并且这个元素是被加在数组尾部的。

for (int i = 0; i < 20; i++)
{
	v1.push_back(i);
}

4.访问vector中的元素

for (int i = 0; i < v1.size(); i++)
{
	cout << v1[i] << endl;
	v1[i] = 100;
	cout << v1[i] << endl;
}

注意:只能对已存在的元素进行赋值或者修改操作,如果是要加入新元素,务必使用push_back。push_back的作用有两个:告诉编译器为新元素开辟空间、将新元素存入新空间里。

比如下面的代码是错误的,但是编译器不会报错,就像是数组越界。

vector<int> vec;
vec[0] = 1;  //错误!

当然我们也可以选择使用迭代器来访问元素

vector<string> v6 = { "hi","my","name","is","lee" };
for (vector<string>::iterator iter = v6.begin(); iter != v6.end(); iter++)
{
	cout << *iter << endl;
	//下面两种方法都都可以检查迭代器是否为空
	cout << (*iter).empty() << endl;
	cout << iter->empty() << endl; 
}

上面是正向迭代,如果我们想从后往前迭代该如何操作?
使用反向迭代器

for (vector<string>::reverse_iterator iter = v6.rbegin(); iter != v6.rend(); iter++)
{
	cout << *iter << endl;
}

5.插入元素

下面的例子,演示了如何使用 insert() 函数向 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;
}

6.删除元素

前面提到,无论是向现有 vector 容器中访问元素、添加元素还是插入元素,都只能借助 vector 模板类提供的成员函数,但删除 vector 容器的元素例外,完成此操作除了可以借助本身提供的成员函数,还可以借助一些全局函数。

基于不同场景的需要,删除 vecotr 容器的元素,可以使用下表 中所示的函数(或者函数组合)。

pop_back() 成员函数的用法非常简单,它不需要传入任何的参数,也没有返回值。举个例子:

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int>demo{ 1,2,3,4,5 };
    demo.pop_back();
    //输出 dmeo 容器新的size
    cout << "size is :" << demo.size() << endl;
    //输出 demo 容器新的容量
    cout << "capacity is :" << demo.capacity() << endl;
    for (int i = 0; i < demo.size(); i++) {
        cout << demo[i] << " ";
    }
    return 0;
}

运行结果为:

size is :4
capacity is :5
1 2 3 4

可以发现,相比原 demo 容器,新的 demo 容器删除了最后一个元素 5,容器的大小减了 1,但容量没变。

如果想删除 vector 容器中指定位置处的元素,可以使用 erase() 成员函数,该函数的语法格式为:

iterator erase (pos);

其中,pos 为指定被删除元素位置的迭代器,同时该函数会返回一个指向删除元素所在位置下一个位置的迭代器。
 

下面的例子演示了 erase() 函数的具体用法:

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int>demo{ 1,2,3,4,5 };
    auto iter = demo.erase(demo.begin() + 1);//删除元素 2
    //输出 dmeo 容器新的size
    cout << "size is :" << demo.size() << endl;
    //输出 demo 容器新的容量
    cout << "capacity is :" << demo.capacity() << endl;
    for (int i = 0; i < demo.size(); i++) {
        cout << demo[i] << " ";
    }
    //iter迭代器指向元素 3
    cout << endl << *iter << endl;
    return 0;
}
运行结果为:
size is :4
capacity is :5
1 3 4 5
3

通过结果不能看出,erase() 函数在删除元素时,会将删除位置后续的元素陆续前移,并将容器的大小减 1。

具体可参考:http://c.biancheng.net/stl/

### C++ STL Vector 使用指南 #### 向量简介 `std::vector` 是一种动态数组,能够自动调整大小来容纳新元素。相比固定尺寸的 `std::array`,它提供了更灵活的数据存储方式[^4]。 #### 创建与初始化 可以创建不同类型的向量并对其进行初始化: ```cpp // 定义一个整数型向量 std::vector<int> intVector; // 初始化含有三个元素{1, 2, 3}的向量 std::vector<int> initVector = {1, 2, 3}; // 使用n个相同值elem初始化向量 size_t n = 5; int elem = 7; std::vector<int> sameValueVec(n, elem); ``` #### 添加和移除元素 支持多种方法用于增加或减少向量内的项目数量: - **push_back()**: 在向量末尾追加单个项目。 ```cpp int newItem = 9; intVector.push_back(newItem); // 追加到末尾 ``` - **pop_back()**: 移除最后一个元素而不返回其值。 ```cpp if (!intVector.empty()) { intVector.pop_back(); } ``` - **insert()**: 插入多个元素至指定位置。 ```cpp auto pos = intVector.begin() + 2; // 指定插入的位置 intVector.insert(pos, 4); // 单一数值插入 intVector.insert(pos, 3, 6); // 多个重复数值插入 ``` - **erase()**: 删除特定范围内的元素或者通过迭代器删除单一元素[^2]。 ```cpp // 清除第一个元素 if(!intVector.empty()){ intVector.erase(intVector.begin()); } // 或者清除某个具体位置上的元素 size_t indexToRemove = 3; if(indexToRemove < intVector.size()){ intVector.erase(intVector.begin() + indexToRemove); } ``` #### 访问元素 提供安全的方式访问内部储存的内容: - **下标运算符[]** - **at()** 方法(带边界检查) ```cpp if (!initVector.empty()) { std::cout << "First element is " << initVector[0]; try{ std::cout << "\nor first with at(): " << initVector.at(0); } catch(const std::out_of_range& e){ std::cerr << "Error accessing out of range."; } } ``` #### 赋值操作 允许整体替换现有内容或将两个对象之间的数据互相交换[^5]: ```cpp // 整体复制另一个向量的内容 sameValueVec.assign(initVector.begin(), initVector.end()); // 数据交换 sameValueVec.swap(initVector); // 等价于上面的操作也可以这样写 sameValueVec = initVector; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值