基于另一个分类向量对向量进行分类

Sorting vector based on another sorted vector

本文关键字:向量 分类 另一个      更新时间:2023-10-16

我有pairvector1,由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

如果vector2由始终出现在vector1中的数字组成,则可以从vector1映射数字,例如vector1是 [3, 2, 4],vector2是 [4, 3];

  1. 将所有元素映射到Exampe 3->0, 2->1, 4->2的索引(密钥是数字,值是索引)。使用地图或哈希图它。
  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)。希望这会有所帮助。

您可以创建一个值地图,类似于

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