如何将两个 std::vector 与 std::pair 组合成一个 std::vector

Posted

技术标签:

【中文标题】如何将两个 std::vector 与 std::pair 组合成一个 std::vector【英文标题】:How to combine two std::vector into a single std::vector with std::pair 【发布时间】:2016-06-20 18:28:14 【问题描述】:

假设我有两个向量“a”和“b”,我想对“a”进行排序,并且希望“b”像排序后的“a”一样重新排序。

我能想到的最合乎逻辑的方法是将这两个向量组合成一个 std::pair 向量,这样我就可以应用 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。

【问题讨论】:

std::pair&lt;int,std::string&gt; 似乎是错误的。你不是说std::pair&lt;std::reference_wrapper&lt;int&gt;, std::reference_wrapper&lt;std::string&gt; &gt;吗? 【参考方案1】:

你想要一个引用对的向量,例如:

#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;

当心虽然不是所有可能的操作都可以通过一对引用来完成。例如。您不能通过无参数构造函数创建它的实例。这就是为什么您不能像示例中那样使用三个空元素初始化向量的原因:

 std::vector<std::pair<int&, std::string&>> p(3);

【讨论】:

以上是关于如何将两个 std::vector 与 std::pair 组合成一个 std::vector的主要内容,如果未能解决你的问题,请参考以下文章

如何确定`range :: view`对象和`std :: vector`之间的等价?

如何将 std::vector<std::vector<double>> 转换为 torch::Tensor?

如何将 xarray 转换为 std::vector?

将特征 C++ 块表达式推回 std::vector

如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix

如何将std :: vector的大小作为int?