首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++】STL 容器 - vector 动态数组容器 ⑧ ( vector 容器添加 / 删除元素 | clear 函数 | insert 函数 | erase 函数 )

【C++】STL 容器 - vector 动态数组容器 ⑧ ( vector 容器添加 / 删除元素 | clear 函数 | insert 函数 | erase 函数 )

作者头像
韩曙亮
发布2023-12-23 09:22:37
发布2023-12-23 09:22:37
9.3K0
举报
文章目录
  • 一、 vector 删除元素
    • 1、vector 容器尾部 删除 元素 - pop_back 函数
    • 2、删除 vector 容器所有元素 - clear 函数
    • 3、删除 vector 容器指定 位置 元素 - erase 函数
    • 4、删除 vector 容器指定 范围 元素 - erase 函数
    • 5、代码示例 - 删除 vector 容器中的偶数元素
  • 二、 vector 插入元素
    • 1、vector 容器尾部 插入 元素 - push_back 函数
    • 2、vector 容器 指定位置 插入 一个元素 - insert 函数
    • 3、vector 容器 指定位置 插入 若干相同元素 - insert 函数
    • 4、vector 容器 指定位置 插入 其它 vector 容器指定范围的元素 - insert 函数

一、 vector 删除元素


1、vector 容器尾部 删除 元素 - pop_back 函数

参考 【C++】STL 容器 - vector 动态数组容器 ④ ( vector 容器容量大小操作 | vector 容器容量判定 | vector 容器重新指定容器大小 | 容器尾部插入/删除元素 ) 二、 vector 容器尾部插入 / 删除元素 博客章节 ,

  • 调用 push_back 函数 , 可以在 vector 容器尾部插入元素 ; 在下面的函数原型中 , 将 val 添加到 vector 容器的末尾 ;
代码语言:javascript
复制
void push_back(const value_type& val);  
  • 调用 pop_back 函数 , 可以在 vector 容器尾部删除元素 ; 在下面的函数原型中 , 该函数用于删除 vector 容器中的最后一个元素
代码语言:javascript
复制
void pop_back();

2、删除 vector 容器所有元素 - clear 函数

clear 函数 是 std::vector 容器的一个成员函数 , 用于移除容器中的所有元素 , 并释放元素占用的内存 ;

std::vector#clear() 函数原型如下 :

代码语言:javascript
复制
void clear() noexcept;

该函数没有 参数 和 返回值 , 当调用 clear 函数时 , 会删除 std::vector 容器中的所有元素 , 并使容器的 size 成员变量变为 0 ;

特别注意 : clear 函数 不会改变容器的 capacity 容量 ;

std::vector 调用 capacity() 函数 , 可以获取容量 , 容量是指容器在内存中分配的空间大小 , 可以容纳的元素数量 ; 当容器中的元素数量超过容量时 , 容器会自动进行扩容 , 分配更多的内存空间来容纳更多的元素 ;

代码示例 : 在下面的函数中 , 调用 vector 容器的 clear 函数 , 清空了容器中的元素 , 容器大小变为 0 , 容器的容量仍然为 3 ;

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include "vector"

// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
    cout << "vector 容器中的元素 : ";
    for (int i = 0; i < v.size(); i++)
    {
        // 输出单个元素
        cout << v[i] << " ";
    }
    // 输出回车换行
    std::cout << std::endl;
    cout << "   vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
    // 输出回车换行
    std::cout << std::endl;
}

int main() {

    // 创建空的 vector 容器
    std::vector<int> vec{ 1, 2, 3 };

    // 打印 vector 容器中的元素
    printV(vec);

    // 清空容器中的元素
    vec.clear();

    // 打印 vector 容器中的元素
    printV(vec);


    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

vector 容器中的元素 : 1 2 3 vector 容器大小 : 3 ; 容器容量 : 3 vector 容器中的元素 : vector 容器大小 : 0 ; 容器容量 : 3 Press any key to continue . . .

3、删除 vector 容器指定 位置 元素 - erase 函数

iterator 迭代器类 的 erase 函数 删除 指定 索引位置 的元素 ;

iterator#erase() 函数原型如下 :

代码语言:javascript
复制
iterator erase( const_iterator pos );  

该 erase() 函数 接受一个指向要删除的元素的常量迭代器作为参数 , 返回一个指向被删除元素之后元素的迭代器 ;

注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include "vector"

// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
    cout << "vector 容器中的元素 : ";
    for (int i = 0; i < v.size(); i++)
    {
        // 输出单个元素
        cout << v[i] << " ";
    }
    // 输出回车换行
    std::cout << std::endl;
    cout << "   vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
    // 输出回车换行
    std::cout << std::endl;
}

int main() {

    // 创建空的 vector 容器
    std::vector<int> vec{ 1, 2, 3 };

    // 打印 vector 容器中的元素
    printV(vec);

    // 删除容器中第一个元素
    vec.erase(vec.begin());

    // 打印 vector 容器中的元素
    printV(vec);


    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

vector 容器中的元素 : 1 2 3 vector 容器大小 : 3 ; 容器容量 : 3 vector 容器中的元素 : 2 3 vector 容器大小 : 2 ; 容器容量 : 3 Press any key to continue . . .

4、删除 vector 容器指定 范围 元素 - erase 函数

iterator 迭代器类 的 erase 函数 删除 指定 范围区间 的元素 ;

注意 : 迭代器 范围是一个 前闭后开 区间 , 下面的代码 只能删除 2 个元素 , 即 第一个和第二个元素 ;

代码语言:javascript
复制
    // 删除容器中第一个和第二个元素
    vec.erase(vec.begin(), vec.begin() + 2);

iterator#erase() 函数原型如下 :

代码语言:javascript
复制
iterator erase( const_iterator first, const_iterator last );

iterator#erase() 函数 接受两个指向要删除的元素的常量迭代器作为参数 , 返回一个指向被删除元素范围的结束位置之后的迭代器 ;

注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include "vector"

// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
    cout << "vector 容器中的元素 : ";
    for (int i = 0; i < v.size(); i++)
    {
        // 输出单个元素
        cout << v[i] << " ";
    }
    // 输出回车换行
    std::cout << std::endl;
    cout << "   vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
    // 输出回车换行
    std::cout << std::endl;
}

int main() {

    // 创建空的 vector 容器
    std::vector<int> vec{ 1, 2, 3 };

    // 打印 vector 容器中的元素
    printV(vec);

    // 删除容器中第一个和第二个元素
    vec.erase(vec.begin(), vec.begin() + 2);

    // 打印 vector 容器中的元素
    printV(vec);


    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

代码语言:javascript
复制
vector 容器中的元素 : 1 2 3
   vector 容器大小 : 3 ; 容器容量 : 3
vector 容器中的元素 : 3
   vector 容器大小 : 1 ; 容器容量 : 3
Press any key to continue . . .

5、代码示例 - 删除 vector 容器中的偶数元素

在下面的代码示例中 , 特别注意 , 元素删除后 返回的是 指向下一个元素位置的 新迭代器 , 新迭代器 需要 设置给 循环控制变量 ,

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include "vector"

// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
    cout << "vector 容器中的元素 : ";
    for (int i = 0; i < v.size(); i++)
    {
        // 输出单个元素
        cout << v[i] << " ";
    }
    // 输出回车换行
    std::cout << std::endl;
    cout << "   vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
    // 输出回车换行
    std::cout << std::endl;
}

int main() {

    // 创建空的 vector 容器
    std::vector<int> vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    // 打印 vector 容器中的元素
    printV(vec);

    // 删除容器中第一个和第二个元素
    // 此处 for 循环条件中, 不写 it++ , it++ 只能在特定条件下使用
    for (vector<int>::iterator it = vec.begin(); it != vec.end();)
    {
        if (*it % 2 == 0)
        {
            // 元素删除后 返回的是 指向下一个元素位置的 新迭代器
            // 这里需要将 新迭代器 设置给循环条件变量
            it = vec.erase(it);      
        }
        else
        {
            // 迭代器指向的元素不删除, 则继续向后循环遍历
            ++it;
        }
    }

    // 打印 vector 容器中的元素
    printV(vec);


    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

代码语言:javascript
复制
vector 容器中的元素 : 1 2 3 4 5 6 7 8 9 10
   vector 容器大小 : 10 ; 容器容量 : 10
vector 容器中的元素 : 1 3 5 7 9
   vector 容器大小 : 5 ; 容器容量 : 10
Press any key to continue . . .

使用 while 循环实现上述效果 :

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include "vector"

// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
    cout << "vector 容器中的元素 : ";
    for (int i = 0; i < v.size(); i++)
    {
        // 输出单个元素
        cout << v[i] << " ";
    }
    // 输出回车换行
    std::cout << std::endl;
    cout << "   vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
    // 输出回车换行
    std::cout << std::endl;
}

int main() {

    // 创建空的 vector 容器
    std::vector<int> vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    // 打印 vector 容器中的元素
    printV(vec);

    // 删除容器中偶数元素

    // 循环控制变量
    vector<int>::iterator it = vec.begin();

    // 判定循环条件 : 循环到末尾迭代器
    while (it != vec.end())
    {
        if (*it % 2 == 0)
        {
            // 元素删除后 返回的是 指向下一个元素位置的 新迭代器
            // 这里需要将 新迭代器 设置给循环条件变量
            it = vec.erase(it);
        }
        else
        {
            // 迭代器指向的元素不删除, 则继续向后循环遍历
            ++it;
        }
    }

    // 打印 vector 容器中的元素
    printV(vec);


    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

代码语言:javascript
复制
vector 容器中的元素 : 1 2 3 4 5 6 7 8 9 10
   vector 容器大小 : 10 ; 容器容量 : 10
vector 容器中的元素 : 1 3 5 7 9
   vector 容器大小 : 5 ; 容器容量 : 10
Press any key to continue . . .

二、 vector 插入元素


1、vector 容器尾部 插入 元素 - push_back 函数

参考 【C++】STL 容器 - vector 动态数组容器 ④ ( vector 容器容量大小操作 | vector 容器容量判定 | vector 容器重新指定容器大小 | 容器尾部插入/删除元素 ) 二、 vector 容器尾部插入 / 删除元素 博客章节 ,

  • 调用 push_back 函数 , 可以在 vector 容器尾部插入元素 ; 在下面的函数原型中 , 将 val 添加到 vector 容器的末尾 ;
代码语言:javascript
复制
void push_back(const value_type& val);  
  • 调用 pop_back 函数 , 可以在 vector 容器尾部删除元素 ; 在下面的函数原型中 , 该函数用于删除 vector 容器中的最后一个元素
代码语言:javascript
复制
void pop_back();

2、vector 容器 指定位置 插入 一个元素 - insert 函数

调用 insert 函数 , 向 vector 容器 指定位置 插入 一个元素 , 该函数 接受一个指向插入位置的常量迭代器和一个要插入的元素作为参数 , 返回一个指向插入位置之后元素的迭代器 ;

函数原型如下 :

代码语言:javascript
复制
iterator insert( const_iterator pos, const value_type& value );  

注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include "vector"

// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
    cout << "vector 容器中的元素 : ";
    for (int i = 0; i < v.size(); i++)
    {
        // 输出单个元素
        cout << v[i] << " ";
    }
    // 输出回车换行
    std::cout << std::endl;
    cout << "   vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
    // 输出回车换行
    std::cout << std::endl;
}

int main() {

    // 创建空的 vector 容器
    std::vector<int> vec{ 1, 2, 3, 4, 5 };

    // 打印 vector 容器中的元素
    printV(vec);


    // 获取首元素迭代器
    std::vector<int>::iterator it = vec.begin();
    // 向 2 索引位置插入 888 元素
    vec.insert(it + 2, 888);


    // 打印 vector 容器中的元素
    printV(vec);


    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

代码语言:javascript
复制
vector 容器中的元素 : 1 2 3 4 5
   vector 容器大小 : 5 ; 容器容量 : 5
vector 容器中的元素 : 1 2 888 3 4 5
   vector 容器大小 : 6 ; 容器容量 : 7
Press any key to continue . . .

3、vector 容器 指定位置 插入 若干相同元素 - insert 函数

调用 insert 函数 , 向 vector 容器 指定位置 插入 若干相同元素 , 该函数 接受一个指向插入位置的常量迭代器和一个要插入的元素作为参数 , 返回一个指向插入位置之后元素的迭代器 ;

函数原型如下 :

代码语言:javascript
复制
iterator insert( const_iterator pos, size_type n, const value_type& value );

注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include "vector"

// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
    cout << "vector 容器中的元素 : ";
    for (int i = 0; i < v.size(); i++)
    {
        // 输出单个元素
        cout << v[i] << " ";
    }
    // 输出回车换行
    std::cout << std::endl;
    cout << "   vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
    // 输出回车换行
    std::cout << std::endl;
}

int main() {

    // 创建空的 vector 容器
    std::vector<int> vec{ 1, 2, 3, 4, 5 };

    // 打印 vector 容器中的元素
    printV(vec);


    // 获取首元素迭代器
    std::vector<int>::iterator it = vec.begin();
    // 向 2 索引位置插入 3 个 888 元素
    vec.insert(it + 2, 3, 888);


    // 打印 vector 容器中的元素
    printV(vec);


    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

代码语言:javascript
复制
vector 容器中的元素 : 1 2 3 4 5
   vector 容器大小 : 5 ; 容器容量 : 5
vector 容器中的元素 : 1 2 888 888 888 3 4 5
   vector 容器大小 : 8 ; 容器容量 : 8
Press any key to continue . . .

4、vector 容器 指定位置 插入 其它 vector 容器指定范围的元素 - insert 函数

调用 insert 函数 , 向 vector 容器 指定位置 插入 其它 vector 容器指定范围的元素 , 该函数 接受一个指向插入位置的常量迭代器和一个要插入的元素作为参数 , 返回一个指向插入位置之后元素的迭代器 ;

函数原型如下 :

代码语言:javascript
复制
template< class InputIt >  
iterator insert( const_iterator pos, InputIt first, InputIt last );

注意 : 返回的是 新的迭代器 , 需要重新使用变量接收该迭代器 , 之前的 迭代器 指向的仍然是被删除的元素 , 如果使用之前的迭代器获取数据 , 程序会崩溃 ;

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;
#include "vector"

// 打印 vector<int> 类型的 STL 容器
void printV(vector<int>& v)
{
    cout << "vector 容器中的元素 : ";
    for (int i = 0; i < v.size(); i++)
    {
        // 输出单个元素
        cout << v[i] << " ";
    }
    // 输出回车换行
    std::cout << std::endl;
    cout << "   vector 容器大小 : " << v.size() << " ; 容器容量 : " << v.capacity();
    // 输出回车换行
    std::cout << std::endl;
}

int main() {

    // 创建空的 vector 容器
    std::vector<int> vec{ 1, 2, 3, 4, 5 };
    std::vector<int> vec2{ 6, 7, 8, 9, 10 };

    // 打印 vector 容器中的元素
    printV(vec);


    // 获取首元素迭代器
    std::vector<int>::iterator it_begin = vec2.begin();
    std::vector<int>::iterator it_end = vec2.end();

    std::vector<int>::iterator it_pos = vec.begin();

    // 向 vec 容器的 2 索引位置插入 另一个 vector 容器 vec2 指定范围区间 元素
    vec.insert(it_pos, it_begin, it_end);


    // 打印 vector 容器中的元素
    printV(vec);


    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

代码语言:javascript
复制
vector 容器中的元素 : 1 2 3 4 5
   vector 容器大小 : 5 ; 容器容量 : 5
vector 容器中的元素 : 6 7 8 9 10 1 2 3 4 5
   vector 容器大小 : 10 ; 容器容量 : 10
Press any key to continue . . .
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、 vector 删除元素
    • 1、vector 容器尾部 删除 元素 - pop_back 函数
    • 2、删除 vector 容器所有元素 - clear 函数
    • 3、删除 vector 容器指定 位置 元素 - erase 函数
    • 4、删除 vector 容器指定 范围 元素 - erase 函数
    • 5、代码示例 - 删除 vector 容器中的偶数元素
  • 二、 vector 插入元素
    • 1、vector 容器尾部 插入 元素 - push_back 函数
    • 2、vector 容器 指定位置 插入 一个元素 - insert 函数
    • 3、vector 容器 指定位置 插入 若干相同元素 - insert 函数
    • 4、vector 容器 指定位置 插入 其它 vector 容器指定范围的元素 - insert 函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档