c++ - 如何使用 std::pair 将两个 std::vector 合并为一个 std::vector

标签 c++ c++11 vector stl

假设我有两个 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/

相关文章:

c++ - 未初始化的读取和不可寻址的访问错误

c++ - 关于为变量设置新值

c++ - 在 C++ 中将 vector.size() 与 string.length() 相乘的意外答案

c++ - vector push_back 和析构函数(?): push_back(~Dword(0))

c++ - 我如何计算 k 取模 100003 中的大数的 n 的组合?

c++ - 免费的 Pascal/C++ 项目在 cout::sentry 中崩溃

c++ - 编译时文本到数字的翻译 (atoi)

c++ - 针对 libstdc++ 和 libc++ 链接 iOS 应用程序

c++ - GCC 使用 jsoncpp 推断传值复制赋值

c++ - 超出时间限制错误 C++