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

时间:2016-06-20 18:28:14

标签: c++ c++11 vector stl

假设我有两个向量“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。

1 个答案:

答案 0 :(得分:2)

你想要一组引用对象:

<div class='asset_list_wrapper'>
    <div id='asset_list'>
    <h1>
    hello
    </h1>
    </div>
    <div id='asset_view'>
        <iframe src='' frameborder='0' id='mainFrame' name='mainFrame' height='100%' width='100%'>hello</iframe>
    </div>
</div>

小心虽然并非所有可能的操作都可以使用一对引用来完成。例如。你无法通过无参数构造函数创建它的实例。这就是为什么你不能用你的例子中的三个空元素初始化向量:

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