HOWTO · C++
在 C++ 中将元素添加到向量对中
本文演示了如何在 C++ 中将元素添加到向量对中
本页内容
若要向 C++ 的 pair 向量追加一个包含两个值的元素,可将每个元素存储为 std::pair<T1, T2>,再使用 push_back 添加兼容的 pair 值;也可以将两个构造参数传给 emplace_back。pair 的两个分量可以是不同类型,例如整数键和字符串值。
表示 pair 向量
像 std::vector<std::pair<int, std::string>> 这样的声明,表示一个以 pair 为元素的向量:每个 pair 都包含一个 int 和一个 std::string。这两个值属于每个元素;它们不是向量中的元素个数。使用这些类型和 pair 操作时,需要包含 <vector>、<utility> 和 <string>。下面的示例还使用 <iostream> 来输出结果。
初始化列表会让向量从两个元素开始。每组内层花括号都会初始化一个 pair,因此 {12, "twelve"} 是一个元素,其第一个值为整数,第二个值为字符串。所以,在执行追加操作之前,向量的大小为二。追加后,新 pair 会位于末尾,原有元素仍保持原来的顺序。
使用 push_back 追加 pair
push_back 会将一个 pair 值追加到向量中。std::make_pair 可以根据给定参数方便地创建这个值,但并非必需:也可以传入显式指定类型的 std::pair<int, std::string>。无论采用哪种方式,该值都必须与向量的元素类型兼容。示例展示了这两种形式,然后输出每个 pair 的 first 和 second 成员,方便查看追加后的元素。
显式指定类型的变量清楚地表明了目标分量类型:第一个值是 int,第二个值是 std::string。将该变量传给 push_back 时,它的 pair 值会被复制到向量中。如果之后还需要使用这个 pair 变量,这种写法会在追加后保留源变量。
运行此示例可比较不同的插入形式。提供的运行时执行成功完成,退出代码为 0,并按以下顺序输出了五个 pair。代码中的示例字符串及输出标签仍为英文:
#include <iostream>
#include <string>
#include <utility>
#include <vector>
int main() {
std::vector<std::pair<int, std::string>> items = {
{12, "twelve"}, {32, "thirty-two"}};
items.push_back(std::make_pair(55, std::string("fifty-five")));
std::pair<int, std::string> next{70, "seventy"};
items.push_back(next);
items.emplace_back(88, "eighty-eight");
for (const auto& item : items) {
std::cout << '(' << item.first << ", " << item.second << ")\n";
}
}
(12, twelve)
(32, thirty-two)
(55, fifty-five)
(70, seventy)
(88, eighty-eight)
使用 emplace_back 原位构造 pair
emplace_back 会转发传入的参数,在向量末尾构造一个 pair 元素并追加它。对于 std::pair<int, std::string>,传入一个整数和一个兼容字符串的值,就提供了 pair 构造函数所需的两个参数。元素类型必须能够由所提供的参数构造。在共享示例中,emplace_back(88, "eighty-eight") 会直接构造并追加该 pair,无需先声明单独的 pair 变量。
如何选择 push_back 或 emplace_back
如果已经有一个 pair 值,无论它是通过 std::make_pair 创建的,还是显式指定为 std::pair,都可以使用 push_back。如果想直接为新 pair 提供构造参数,则使用 emplace_back。两者都会向向量追加一个元素;根据现有代码中的是 pair 值,还是用于构造 pair 的值来选择即可。这个区别说明了如何提供元素,并不保证其中一种操作更快。