【问题标题】:How do I sort a vector with respect to another vector?如何相对于另一个向量对向量进行排序?
【发布时间】:2014-09-24 19:46:58
【问题描述】:

我有几个具有相同数据类型的向量。

   v  < int > = {5,4,1,2}
   v2 < int > = {2,4,3,5,1,6,8,7}
   v3 < int > = {1,4,2,3}

有任何方法可以对向量 v2 、 v3 ... 相对于向量 v using STL of C++(algorithm) 进行排序,以便

排序后 v2 将是 {5,4,1,2,3,6,7,8} 当它相对于 v 排序时,v3 将是 {4,1,2,3} 当它相对于排序时到 v 。

Edit:

有些人可能不清楚。 让我解释一下..
排序后的向量有两个部分,一个是 A,另一个是 B。
A 包含向量 v 的元素,即 A 是 v 的子集,它遵循与 v 中相同的顺序
B 包含给定向量(v_i) 的剩余元素{v_i - A} 并且已排序。
所以对于排序后的向量 v2 将是

 v2 = A union B
 A = {5,4,1,2}
 B = {3,6,7,8} 

【问题讨论】:

  • 请注意,这里没有 STL,也没有标头 algorithm.h
  • 目前还不完全清楚(至少对我而言)您要在这里完成什么。相对于 B 对 A 进行排序是什么意思(对于 A 和 B 的任何值)?
  • 检查它在那里。 cplusplus.com/reference/algorithm
  • @user3919801 将是 algorithm,而不是 algorithm.h。而你的描述仍然像伦敦的秋天雾一样清晰。
  • @WhozCraig 已更新,它在旧编译器中:P

标签: c++ sorting vector stl stl-algorithm


【解决方案1】:
class StrangeComparison {
public:
  StrangeComparison(const vector<int>& ordering) : ordering_(ordering) {}
  bool operator()(int a, int b) const {
    auto index_a = find(ordering_.begin(), ordering_.end(), a);
    auto index_b = find(ordering_.begin(), ordering_.end(), b);
    return make_pair(index_a, a) < make_pair(index_b, b);
  }
private:
  const vector<int>& ordering_;
};

sort(v2.begin(), v2.end(), StrangeComparison(v));

Working example。提高效率留给读者练习(提示:查看std::find 调用)。

【讨论】:

  • 它不能在低于 C++ 11 的旧编译器中工作。即它在 C++ 11 中工作。在这里查看ideone.com/HjU0u8 我尝试将 auto 更改为 int ,但仍然无法正常工作..
  • 不应该是int - 改成vector&lt;int&gt;::const_iterator
【解决方案2】:

您只需要使用以下规则来扩充您的比较功能:

  1. 如果要排序的向量中存在第一个值,但其中不存在第二个值,则第一个
  2. 如果第二个值存在但第一个值不存在,则第二个
  3. 如果两个值都存在,则比较它们在该向量中的索引值

如果这些条件都不为真,则现有的比较逻辑将运行。

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2023-04-04
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多