如何对std :: vector进行排序,但不使用std :: sort更改特定元素?

时间:2017-12-10 18:07:47

标签: c++ sorting stl

我有一个包含正整数和-1的向量。我的问题是我想对矢量进行排序,但不要只使用-1 elements触摸std::sort(我知道其他解决方法)。

例如:

  

输入:[-1,150,190,170,-1,-1,160,180]

     

输出:[-1,150,160,170,-1,-1,180,190]

我的想法是解决它,但它没有用:

sort(myVector.begin(), myVector.end(), [&](const int& a,const int& b)->bool {
        if (a == -1 || b == -1)
            return &a < &b;
        return a < b;
    });
  

我的输出是:[-1,150,170,190,-1,-1,160,180]

     

输出应为:[-1,150,160,170,-1,-1,180,190]

有没有想法使用std::sort来解决它?

2 个答案:

答案 0 :(得分:3)

std::sort无法做到这一点。它根据严格的弱排序对一系列元素进行排序。您定义的顺序不是strict-weak。并且没有办法定义严格弱的排序,这样某些值保留在当前位置。因此,如果您尝试使用sort这样的排序,则会得到未定义的行为。

所以你必须编写自己的排序功能。或者你可以删除-1(记录他们的位置),对列表进行排序,然后重新插入。

答案 1 :(得分:0)

不能单独使用std::sort完成。另一种方法是提取-1 s的位置,清除所有-1,对矢量进行排序并在适当的地方重新插入:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v{ -1, 150, 190, 170, -1, -1, 160, 180 };
    std::vector<int> vtemp;
    auto it = v.begin();
    while ((it = std::find_if(it, v.end(), [](int x){ return x == -1; })) != v.end()) {
        vtemp.push_back(std::distance(v.begin(), it));
        it++;
    }
    v.erase(std::remove(v.begin(), v.end(), -1), v.end());
    std::sort(v.begin(), v.end());
    for (auto el : vtemp){
        v.insert(v.begin() + el, -1);
    }
}