vector的操作

本文详细介绍了C++中vector对象的定义、初始化方式以及常用的基础操作,包括元素添加、查询、索引、修改、比较,以及使用迭代器进行遍历、插入和删除。同时讨论了vector的内存管理策略和调整大小的方法。
摘要由CSDN通过智能技术生成

1、vector对象的定义和初始化方式
常用的初始化方式及作用如下:

vector 中的数据类型 T 可以代表任何数据类型,如 int、string、class、vector(构建多维数组) 等,就像一个可以放下任何东西的容器,因此 vector 也常被称作容器。字符串类型 string 也是一种容器,c++ 中的不同种类的容器拥有很多相同的操作,因此 string 的很多操作方法可以直接用在 vector 中。

vector<T> v1    v1 是一个元素类型为 T 的空 vector
vector<T> v2(v1)    使用 v2 中所有元素初始化 v1
vector<T> v2 = v1    同上
vector<T> v3(n, val)    v3 中包含了 n 个值为 val 的元素
vector<T> v4(n)    v3 中包含了 n 个默认值初始化的元素
vector<T> v5{a, b, c...}    使用 a, b, c... 初始化 v5
vector<T> v1    同上
vector<vector<int>> matrix(M,vector<int>(N));

2、vector 常用基础操作
 下表列出了 添加元素、查询、索引、赋值、比较 等常用操作方法。

v.empty()    如果 v 为空则返回 true,否则返回 false
v.size()    返回 v 中元素的个数
v.push_back(val)    
向 vector 的尾端添加值为 val 的元素。

注意:vector 不支持 push_front 操作。

v.pop_back(val)    
删除尾元素,返回void。vector同样 不支持 pop_front 操作。若想在同时弹出元素的值,就必须在执行弹出之前保存它(可以使用 v.back())。

v[n]    返回 v 中第 n 个位置上元素的引用,不能用下标操作添加元素
v.back()    返回 v 中最后一个元素的引用
v.front()    返回 v 中第一个元素的引用
v1 = v2    用 v2 中的元素替换 v1 中的元素
v1 = {a, b, c...}    用元素 {a, b, c...} 替换 v1 中的元素
v1 == v2    当且仅当拥有相同数量且相同位置上值相同的元素时,v1 与 v2 相等
v1 != v2    自行体会
<, <=, >, >=    以字典序进行比较
3、使用迭代器的遍历、插入、删除操作
迭代器类似于指针,提供了对象的间接访问,但获取迭代器并不是使用取地址符。如果将指针理解为元素的“地址”,那么迭代器可以理解为元素的“位置”。可以使用迭代器访问某个元素,迭代器也能从一个元素移动到另一个元素。

一个迭代器的范围由一对迭代器表示,分别为 begin 和 end。其中 begin 成员返回指向第一个元素的迭代器;end 成员返回容器最后一个元素的下一个位置(one past the end),也就是指向一个根本不存在的尾后位置,这样的迭代器没什么实际含义,仅是个标记而已,表示已经处理完了容器中的所有元素。所以 begin 和 end 表示的是一个左闭右开的区间 [ begin , end)

迭代器可以用来实现容器的遍历、插入等操作,可以细品下面的例子:

1、遍历


 

#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main(void)
{
    vector<string> a{"0", "1", "2", "3", "4", "5", "6", "7", "8"};
    auto it = a.begin();  // 返回一个迭代器类型,一般来说我们并不关心迭代器具体的数据类型
    while(it != a.end())
    {
        cout << *it << " ";
        it++;
    }
    return 0;
}
// 运行结果 //
0 1 2 3 4 5 6 7 8 

2、插入

插入操作的函数:

v.insert(p, n, val) :在迭代器 p 之前插入 n 个值为 val 的元素,返回新添加的第一个元素的迭代器。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main(void)
{
    vector<int> a{1, 2, 3, };
    auto it1 = a.begin();  // 返回一个迭代器类型,一般来说我们并不关心迭代器具体的数据类型
    auto it2 = a.insert((it1+1), {6, 7, 8});  // 利用迭代器在第二个元素之前插入数据
    cout << *it2 << endl;  // 返回的是新插入元素第一个元素的迭代器
    auto it = a.begin();  // 
    while(it != a.end())
    {
        cout << *it << " ";
        it++;
    }
    return 0;
}
// 输出结果 //
6
1 6 7 8 2 3

3、删除 

删除操作的函数:

v.erase(p) :删除迭代器 p 所指的元素,返回指向被删除元素之后元素的迭代器。

v.erase(b, e) :删除迭代器 b, e 之间的元素,返回指向最后一个被删除元素之后元素的迭代器。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main(void)
{
    vector<int> a{1, 2, 3, };
    auto it1 = a.begin();  // 返回一个迭代器类型,一般来说我们并不关心迭代器具体的数据类型
    auto it2 = a.erase(it1+1);  // 删除元素 2
    cout << *it2 << endl;  // 返回的是新插入元素第一个元素的迭代器
    auto it = a.begin();  // 
    while(it != a.end())
    {
        cout << *it << " ";
        it++;
    }
    return 0;
}
// 运行结果 //
3
1 3

4、改变vector大小 及其 内存分配机制
与内置数组一样,vector 的所有元素必须存放在一片连续的内存中,但 vector 的大小可变性使得其所占用的内存大小也是可变的。

为了避免每次改变 vector 时重新分配内存空间再将原来的数据从新拷贝到新空间的操作,标准库实现者采用了减少容器空间重新分配次数的策略:当不得不获取新空间时,vector(string 也是如此)通常会分配比需求更大的空间作为预留的备用空间,这样就减少了重新分配空间的次数。

改变 vector 的大小可以使用 v.resize(n, t) 函数,调整 v 的大小为 n 个元素,任何新添加的元素都初始化为值 t 。
 

#include <iostream>
#include <vector>
using namespace std;
 
int main(void)
{
    vector<vector<int>> a;
    a.resize(3, vector<int>(3));
    cout << "row : " << a.size() << endl;
    cout << "col : " << a[0].size() << endl;
    return 0;
}
// 输出 //
row : 3
col : 3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值