【问题标题】:How to sort std::vector but do not change specific elements using std::sort?如何对 std::vector 进行排序但不使用 std::sort 更改特定元素?
【发布时间】:2017-12-10 18:07:46
【问题描述】:

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

例如:

输入:[-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 来解决它?

【问题讨论】:

  • 我不认为这是直接可能的。 std::sort 函数在一个范围内运行,没有办法暂时删除元素并稍后将它们添加回相同的位置(当然你可以分多个步骤执行此操作,但我相信这不是你要问的)。我也不明白您所说的“自定义”std::sort 是什么意思。 std::sort 的工作方式也是实现定义的 AFAIK,因此您无法对排序如何发生做出任何假设。
  • @Yashas 对不起我的英语,你是对的,我编辑了我的问题
  • -1s 的位置提取到一个向量中,删除所有-1s,排序并返回。

标签: c++ sorting stl


【解决方案1】:

std::sort 不能这样做。它按照严格的弱排序对一系列元素进行排序。您定义的顺序不是strict-weak。并且没有办法定义严格弱的排序,使得某些值保持在其当前位置。因此,如果您尝试将sort 用于此类排序,则会出现未定义的行为。

因此,您将不得不编写自己的排序函数。或者您可以删除 -1(记录它们的位置),对列表进行排序,然后重新插入它们。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 有明显的优化来提高速度(尤其是重新插入 -1),但这是一种合理的方法。您甚至可以在没有额外空间的情况下通过将 -1 的位置存储在向量本身中来完成此操作,因为您将它们挤压出来。
    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 2010-09-19
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多