假设我有两个 vector “a”和“b”,我想对“a”进行排序,并且希望“b”像排序后的“a”一样重新排序。
我能想到的最合乎逻辑的方法是将这两个 vector 组合成一个 std::pair vector ,这样我就可以应用 std::sort,下面是一个玩具示例
std::vector<int> a(3,1);
std::vector<std::string> b(3,"hi");
std::vector<std::pair<int,std::string>> p(3);
for(int i=0;i<a.size();i++){
p.push_back(std::make_pair(std::ref(a[i]),std::ref(b[i])));
}
p[0].first = p[0].first+1;
std::cout << p[0].first << " " << a[0] << std::endl;
我期望它打印 2 2,但它打印的是 2 1。我还尝试用
替换 for 循环for(int i=0;i<a.size();i++){
p[i].first = std::ref(a[i]);
p[i].second = std::ref(b[i]);
}
但它仍然打印 2 1。我可以在排序后将值从“p”复制回“a”和“b”,但当“a”和“b”很大时,这会效率低下。我做错了什么?
我的编译器是 gcc 4.9.3。
最佳答案
你想要一个引用对的 vector ,例如:
#include <iostream>
#include <string>
#include <vector>
#include <utility>
int main() {
std::vector<int> a(3,1);
std::vector<std::string> b(3,"hi");
std::vector<std::pair<int&, std::string&>> p;
for(int i=0;i<a.size();i++){
p.push_back(std::pair<int&, std::string&>(a[i],b[i]));
}
p[0].first = p[0].first+1;
std::cout << p[0].first << " " << a[0] << std::endl;
}
请注意,但并非所有可能的操作都可以通过一对引用来完成。例如。您无法通过无参数构造函数创建它的实例。这就是为什么您不能像示例中那样使用三个空元素初始化 vector :
std::vector<std::pair<int&, std::string&>> p(3);
关于c++ - 如何使用 std::pair 将两个 std::vector 合并为一个 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37929365/