2017-09-12 89 views
0

我已经得到了pair一个vector1,排序由int键:分类矢量

std::vector <pair <int,string> > vector1; 
//6 5 1 8 4 2 

然后,我有另一种vector2由包含在vector1数字:

std::vector <string> vector2; 
//1 5 6 8 

我如何使用与vector1中相同的密钥对vector2进行分类?我想:

unsorted: 1 5 6 8 
sorted: 6 5 1 8 

unsorted: 6 5 1 2 4 
sorted: 6 5 1 2 4 
+2

*“vector2由数字组成”*和'std :: vector vector2'? – Jarod42

+0

@ Jarod42是的。后来我需要这个 –

+0

我没有完全理解它,所以你想对vector2 进行排序,它们与vector1中出现的优先级相同?因此,例如,如果vector1是[2,3,4],未排序的vector2是[3,4],排序后它应该是[4,3],那是对的吗? –

回答

0

,你可以从向量1映射的数字,例如向量1是[3, 2, 4],vector2是[4, 3];

  1. 图中的所有元素,索引exampe 3->0, 2->1, 4->2 (键是数字和值索引)。使用地图或hashmap为 它。
  2. 现在遍历vector2,在地图上为它的每个元素的搜索和地图的值改为:4 becomes 2, 3 becomes 0所以现在vector2成为[2, 0]
  3. 现在使用sort(vector2.begin(), vector2.end()); vector2成为[0, 2]
  4. 现在遍历vector2并为每个元素我用vector1 [i]代替它: 0->3(因为vector1中第0个索引处的数字是3),2->4(因为vector1中第二个索引处的数字是4)。 希望这有助于。
0

如果vector2由总是出现在向量1号,您可以创建地图的价值观,像

void SortAccording(std::vector<int>& vec, const std::vector<std::pair<int, string>>& ref) 
{ 
    std::map<int, int> m; 

    int counter = 0; 
    for (auto& p : ref) { 
     m[p.first] = counter++; 
    } 
    std::sort(vec.begin(), 
       vec.end(), 
       [&](int lhs, int rhs) { return m.at(lhs) < m.at(rhs); }); 
} 
+0

我完全不理解它。我正在使用C++ 98 –

+1

我们现在可以使用C++ 17,因此如果您仅限于C++ 98/03,请正确标记 – Jarod42