现在位置: 首页 > C++ 教程 > 正文

C++ <vector> insert 函数

C++ 容器类 <vector> C++ 容器类 <vector>


insert 是 vector 中用于在指定位置插入元素的函数,是容器中最灵活的插入方式。

insert 是容器类的成员函数,用于在容器的指定位置插入一个或多个元素。它接受一个迭代器位置和要插入的元素。

insert 提供了在任意位置插入元素的能力,虽然在 vector 中效率不如 push_back(需要移动后续元素),但功能更强大。

单词释义insert 表示"插入",即在指定位置添加元素。


基本语法与参数

insert 是容器类的成员函数,需要指定插入位置和元素。

语法格式

// 在 pos 位置插入 value 的副本
iterator insert(iterator pos, const T& value);

// 在 pos 位置插入 value 的副本(移动)
iterator insert(iterator pos, T&& value);

// 在 pos 位置插入 n 个 value 的副本
void insert(iterator pos, size_type n, const T& value);

// 在 pos 位置插入 [first, last) 范围内的元素
template&lt;class InputIt&gt;
void insert(iterator pos, InputIt first, InputIt last);

// 初始化列表方式插入
void insert(iterator pos, std::initializer_list&lt;T&gt; ilist);

参数说明

  • 参数pos
    • 类型: 迭代器(iterator
    • 描述: 插入位置的迭代器。新元素将插入到 pos 之前。
    • 参数value
      • 类型: 与容器元素类型相同
      • 描述: 要插入的元素值。
      • 参数n
        • 类型: size_type
        • 描述: 要插入的元素个数。

      函数说明

      • 返回值: 返回指向第一个插入元素的迭代器(对于单元素插入)。
      • 效果: 在指定位置插入元素,后续元素依次后移。
      • 注意insert 可能导致内存重新分配,所有现有迭代器可能失效。

      实例

      让我们通过一系列例子,彻底掌握 insert 的用法。

      示例 1:基础用法 - 插入单个元素

      实例

      #include <iostream>
      #include <vector>

      int main() {
          std::vector<int> numbers = {1, 2, 3, 4, 5};

          std::cout << "原始 vector: ";
          for(int n : numbers) std::cout << n << " ";
          std::cout << std::endl;

          // 在第二个位置(索引 1)插入 100
          auto it = numbers.begin() + 1;
          numbers.insert(it, 100);

          std::cout << "插入 100 后: ";
          for(int n : numbers) std::cout << n << " ";
          std::cout << std::endl;

          return 0;
      }

      运行结果预期:

      原始 vector: 1 2 3 4 5
      插入 100 后: 1 100 2 3 4 5
      

      代码解析:

      1. numbers.begin() + 1 指向第二个元素的位置。
      2. insert 在该位置前插入 100。
      3. 后续元素都向后移动一位。

      示例 2:在开头插入元素

      使用 begin() 可以在容器开头插入元素。

      实例

      #include <iostream>
      #include <vector>
      #include <string>

      int main() {
          std::vector<std::string> names = {"Bob", "Charlie"};

          std::cout << "原始: ";
          for(const auto& n : names) std::cout << n << " ";
          std::cout << std::endl;

          // 在开头插入
          names.insert(names.begin(), "Alice");

          std::cout << "在开头插入 Alice: ";
          for(const auto& n : names) std::cout << n << " ";
          std::cout << std::endl;

          return 0;
      }

      运行结果预期:

      原始: Bob Charlie
      在开头插入 Alice: Alice Bob Charlie
      

      代码解析:

      • names.begin() 指向第一个元素。
      • 在该位置插入,新元素成为第一个元素。

      示例 3:插入多个相同元素

      可以在指定位置插入多个相同的元素。

      实例

      #include <iostream>
      #include <vector>

      int main() {
          std::vector<int> numbers = {1, 5};

          std::cout << "原始: ";
          for(int n : numbers) std::cout << n << " ";
          std::endl;

          // 在中间插入 3 个 0
          auto it = numbers.begin() + 1;
          numbers.insert(it, 3, 0);

          std::cout << "插入 3 个 0 后: ";
          for(int n : numbers) std::cout << n << " ";
          std::cout << std::endl;

          return 0;
      }

      运行结果预期:

      原始: 1 5
      插入 3 个 0 后: 1 0 0 0 5
      

      代码解析:

      • insert(it, 3, 0) 在位置 it 前插入 3 个值为 0 的元素。

      示例 4:插入另一个 vector 的元素

      可以从另一个容器插入多个元素。

      实例

      #include <iostream>
      #include <vector>

      int main() {
          std::vector<int> v1 = {1, 2, 3};
          std::vector<int> v2 = {10, 20, 30};

          std::cout << "v1: ";
          for(int n : v1) std::cout << n << " ";
          std::cout << std::endl;

          std::cout << "v2: ";
          for(int n : v2) std::cout << n << " ";
          std::cout << std::endl;

          // 在 v1 的第二个位置插入 v2 的所有元素
          v1.insert(v1.begin() + 1, v2.begin(), v2.end());

          std::cout << "插入后 v1: ";
          for(int n : v1) std::cout << n << " ";
          std::cout << std::endl;

          return 0;
      }

      运行结果预期:

      v1: 1 2 3
      v2: 10 20 30
      插入后 v1: 1 10 20 30 2 3
      

      代码解析:

      • v1.insert(v1.begin() + 1, v2.begin(), v2.end()) 在 v1 的第二个位置前插入 v2 的所有元素。

      示例 5:使用初始化列表插入

      C++11 支持使用初始化列表插入元素。

      实例

      #include <iostream>
      #include <vector>

      int main() {
          std::vector<int> numbers = {1, 5};

          std::cout << "原始: ";
          for(int n : numbers) std::cout << n << " ";
          std::cout << std::endl;

          // 使用初始化列表插入
          numbers.insert(numbers.begin() + 1, {2, 3, 4});

          std::cout << "插入后: ";
          for(int n : numbers) std::cout << n << " ";
          std::cout << std::endl;

          return 0;
      }

      运行结果预期:

      原始: 1 5
      插入后: 1 2 3 4 5
      

      代码解析:

      • 使用 initializer_list 可以一次性插入多个元素。

      示例 6:insert 的效率问题

      在 vector 中使用 insert 在开头或中间位置插入元素效率较低。

      实例

      #include <iostream>
      #include <vector>
      #include <chrono>

      int main() {
          const int N = 10000;

          // 在开头插入(效率低)
          std::vector<int> v1;
          auto start1 = std::chrono::high_resolution_clock::now();
          for(int i = 0; i < N; ++i) {
              v1.insert(v1.begin(), i);
          }
          auto end1 = std::chrono::high_resolution_clock::now();
          auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(end1 - start1);

          // 在末尾插入(效率高)
          std::vector<int> v2;
          v2.reserve(N);
          auto start2 = std::chrono::high_resolution_clock::now();
          for(int i = 0; i < N; ++i) {
              v2.push_back(i);
          }
          auto end2 = std::chrono::high_resolution_clock::now();
          auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>(end2 - start2);

          std::cout << "在开头插入 " << N << " 个元素耗时: " << duration1.count() << " 微秒" << std::endl;
          std::cout << "在末尾插入 " << N << " 个元素耗时: " << duration2.count() << " 微秒" << std::endl;

          return 0;
      }

      代码解析:

      • 在 vector 开头插入元素需要移动所有现有元素,效率很低。
      • 如果需要频繁在开头插入,考虑使用 dequelist
      • 优先使用 push_back 在末尾添加元素。

      C++ 容器类 <vector> C++ 容器类 <vector>