在 C++ 中,vectorlist 都是常用的容器,但它们的插入操作在性能和使用方式上有一些区别。

vector 的插入操作

vector 是一个动态数组,因此它支持在任何位置插入元素,但插入操作可能涉及到内存重新分配和元素移动。

插入操作示例:
  1. 在末尾插入元素
std::vector<int> vec = {1, 2, 3};
vec.push_back(4);  // 在末尾插入元素4
  • 1.
  • 2.
  1. 在指定位置插入元素
std::vector<int> vec = {1, 2, 3};
vec.insert(vec.begin() + 1, 4);  // 在位置1插入元素4,vec变为{1, 4, 2, 3}
  • 1.
  • 2.
  1. 插入多个元素
std::vector<int> vec = {1, 2, 3};
vec.insert(vec.begin() + 1, 2, 4);  // 在位置1插入两个4,vec变为{1, 4, 4, 2, 3}
  • 1.
  • 2.
  1. 插入另一个容器的范围
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
vec1.insert(vec1.end(), vec2.begin(), vec2.end());  // 在末尾插入vec2的所有元素
  • 1.
  • 2.
  • 3.
list 的插入操作

list 是一个双向链表,因此插入操作非常高效,不涉及到内存重新分配和元素移动。

插入操作示例:
  1. 在末尾插入元素
std::list<int> lst = {1, 2, 3};
lst.push_back(4);  // 在末尾插入元素4
  • 1.
  • 2.
  1. 在开头插入元素
std::list<int> lst = {1, 2, 3};
lst.push_front(0);  // 在开头插入元素0
  • 1.
  • 2.
  1. 在指定位置插入元素
std::list<int> lst = {1, 2, 3};
auto it = std::next(lst.begin());  // 获得第二个元素的位置
lst.insert(it, 4);  // 在位置1插入元素4,lst变为{1, 4, 2, 3}
  • 1.
  • 2.
  • 3.
  1. 插入多个元素
std::list<int> lst = {1, 2, 3};
auto it = std::next(lst.begin());
lst.insert(it, 2, 4);  // 在位置1插入两个4,lst变为{1, 4, 4, 2, 3}
  • 1.
  • 2.
  • 3.
  1. 插入另一个容器的范围
std::list<int> lst1 = {1, 2, 3};
std::list<int> lst2 = {4, 5, 6};
lst1.insert(lst1.end(), lst2.begin(), lst2.end());  // 在末尾插入lst2的所有元素
  • 1.
  • 2.
  • 3.
总结
  • vector:适用于需要随机访问的场景,插入操作可能涉及到内存重新分配和元素移动,效率较低。
  • list:适用于频繁插入和删除的场景,插入操作效率较高,但不支持随机访问。

选择哪种容器取决于具体需求和使用场景。