使用 STL 对部分向量进行排序
Sort partial vector using STL
我有一个指向数组的指针向量,vector<float*> points
。该数组的长度为 d
。我想将此向量 points[i]
位置排序为 points[j]
位置(包含或不包含,无关紧要,因为我们总是可以相应地调整 1)。此外,我希望它根据第 0 <= x < d
个条目进行排序。我不关心领带是如何解决的(也就是说,没有打破领带或对 (x+1)%d
th 条目进行排序——无关紧要)。 C++ 中是否有用于此的函数?我知道我很可能可以通过为此定义我自己的比较器函数来完成 x-th
轴的事情,但是只对向量的一部分进行排序是主要的事情。我没有找到与之相关的任何内容(partial_sort() 接近,但不是我想要的),所以如果之前有人问过这个问题,我很抱歉。任何帮助都会很棒。谢谢...
您可以使用 std::sort
并向其传递您希望排序的迭代器范围,如下所示:
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };
std::sort(v.begin(), std::min(v.begin() + 3, v.end()));
for (auto const i : v) {
std::cout << i << " ";
}
return 0;
}
现在输出将是:
1 2 4 6 5 7 2
所以只有前 3 个元素被排序。
请仔细看看std::min(v.begin() + 3, v.end())
。这可以防止你的结局不超过 v.end()
.
更新
正如 @Timo 所建议的那样,最好使用 std::next(v.begin(), std::min(static_cast<size_t>(3), v.size()))
而不是 std::min(v.begin() + 3, v.end())
,因此完整的代码将是:
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };
std::sort(v.begin(), std::next(v.begin(), std::min(static_cast<size_t>(3), v.size())));
for (auto const i : v) {
std::cout << i << " ";
}
return 0;
}
添加到@NutCracker 的答案中:
您可以像这样只对容器的范围进行排序:
std::sort(container.begin() + startIndex, container.begin() + endIndex);
除了@NutCracker 的回答以及是否有人感兴趣,这里有一个使用 Range-v3 的解决方案:
#include <vector>
#include <iostream>
#include <range/v3/action/sort.hpp>
#include <range/v3/view/drop.hpp>
#include <range/v3/view/take.hpp>
int main() {
using namespace ranges;
std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };
v | views::drop(1) | views::take(5) | actions::sort;
std::cout << views::all(v);
return 0;
}
我有一个指向数组的指针向量,vector<float*> points
。该数组的长度为 d
。我想将此向量 points[i]
位置排序为 points[j]
位置(包含或不包含,无关紧要,因为我们总是可以相应地调整 1)。此外,我希望它根据第 0 <= x < d
个条目进行排序。我不关心领带是如何解决的(也就是说,没有打破领带或对 (x+1)%d
th 条目进行排序——无关紧要)。 C++ 中是否有用于此的函数?我知道我很可能可以通过为此定义我自己的比较器函数来完成 x-th
轴的事情,但是只对向量的一部分进行排序是主要的事情。我没有找到与之相关的任何内容(partial_sort() 接近,但不是我想要的),所以如果之前有人问过这个问题,我很抱歉。任何帮助都会很棒。谢谢...
您可以使用 std::sort
并向其传递您希望排序的迭代器范围,如下所示:
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };
std::sort(v.begin(), std::min(v.begin() + 3, v.end()));
for (auto const i : v) {
std::cout << i << " ";
}
return 0;
}
现在输出将是:
1 2 4 6 5 7 2
所以只有前 3 个元素被排序。
请仔细看看std::min(v.begin() + 3, v.end())
。这可以防止你的结局不超过 v.end()
.
更新
正如 @Timo 所建议的那样,最好使用 std::next(v.begin(), std::min(static_cast<size_t>(3), v.size()))
而不是 std::min(v.begin() + 3, v.end())
,因此完整的代码将是:
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };
std::sort(v.begin(), std::next(v.begin(), std::min(static_cast<size_t>(3), v.size())));
for (auto const i : v) {
std::cout << i << " ";
}
return 0;
}
添加到@NutCracker 的答案中:
您可以像这样只对容器的范围进行排序:
std::sort(container.begin() + startIndex, container.begin() + endIndex);
除了@NutCracker 的回答以及是否有人感兴趣,这里有一个使用 Range-v3 的解决方案:
#include <vector>
#include <iostream>
#include <range/v3/action/sort.hpp>
#include <range/v3/view/drop.hpp>
#include <range/v3/view/take.hpp>
int main() {
using namespace ranges;
std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };
v | views::drop(1) | views::take(5) | actions::sort;
std::cout << views::all(v);
return 0;
}