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






一、 vector 删除元素



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


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

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

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


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


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

void clear() noexcept;

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


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

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


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

#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 . . .

扫描二维码关注公众号,回复: 17296136 查看本文章

在这里插入图片描述


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


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


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

iterator erase( const_iterator pos );  

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


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


代码示例 :

#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 个元素 , 即 第一个和第二个元素 ;

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

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

iterator erase( const_iterator first, const_iterator last );

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


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


代码示例 :

#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;
};

执行结果 :

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

在这里插入图片描述


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


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


代码示例 :

#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;
};

执行结果 :

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 循环实现上述效果 :

代码示例 :

#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;
};

执行结果 :

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 容器的末尾 ;
void push_back(const value_type& val);  
  • 调用 pop_back 函数 , 可以在 vector 容器尾部删除元素 ; 在下面的函数原型中 , 该函数用于删除 vector 容器中的最后一个元素
void pop_back();

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


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

函数原型如下 :

iterator insert( const_iterator pos, const value_type& value );  

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



代码示例 :

#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;
};

执行结果 :

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 容器 指定位置 插入 若干相同元素 , 该函数 接受一个指向插入位置的常量迭代器和一个要插入的元素作为参数 , 返回一个指向插入位置之后元素的迭代器 ;

函数原型如下 :

iterator insert( const_iterator pos, size_type n, const value_type& value );

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



代码示例 :

#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;
};

执行结果 :

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 容器指定范围的元素 , 该函数 接受一个指向插入位置的常量迭代器和一个要插入的元素作为参数 , 返回一个指向插入位置之后元素的迭代器 ;

函数原型如下 :

template< class InputIt >  
iterator insert( const_iterator pos, InputIt first, InputIt last );

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



代码示例 :

#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;
};

执行结果 :

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 . . .

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/135125108