C++ <vector> insert 函数
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<class InputIt> void insert(iterator pos, InputIt first, InputIt last); // 初始化列表方式插入 void insert(iterator pos, std::initializer_list<T> 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;
}
#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
代码解析:
numbers.begin() + 1指向第二个元素的位置。insert在该位置前插入 100。- 后续元素都向后移动一位。
示例 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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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 开头插入元素需要移动所有现有元素,效率很低。
- 如果需要频繁在开头插入,考虑使用
deque或list。 - 优先使用
push_back在末尾添加元素。

C++ 容器类 <vector>