如何针对另一个向量对向量进行排序?

时间:2014-09-24 19:46:58

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

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

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

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

排序后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} 

2 个答案:

答案 0 :(得分: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来电)。

答案 1 :(得分:0)

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

  1. 如果向量中存在第一个值以进行排序,但第二个值不存在于其中,则第一个&lt;第二
  2. 如果第二个值存在但第一个不存在,那么第二个&lt;第一
  3. 如果两个值都存在,则比较它们在该向量中的索引值
  4. 如果这些条件都不成立,则现有的比较逻辑将运行。