我有一个包含正整数和-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
来解决它?
答案 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);
}
}