c# - C++等效于C#Array.Sort

标签 c# c++ sorting

如果存在,那么C#相当于 Array.Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32) 的C++?
我查看了C#函数的源代码,但无法解决。

最佳答案

您提供的doc链接没有提及算法复杂性(毫无疑问,考虑到该公司提供必要信息的程度如何)。通常,如果没有至少一个额外的O(N)空间,这看起来是不可行的。链接到注释的Konrad解决方案可能是最便宜的解决方案,但是如果数组中的元素很小且很琐碎,则可以按以下方式对它们进行排序:只需将它们放在 map 中即可:

std::multimap<TKey, TValue> items;
for(std::size_t i{}; i < keys.size(); ++i) {
    items.emplace(std::move(keys[i]), std::move(values[i]));
}

std::size_t i{};
for(auto &&kv: items) {
    keys[i] = kv.first;
    keys[i] = std::move(kv.second);
    ++i;
}

(可以使用两个单行的std::transform代替第二个循环,一个复制键,另一个复制值。)

或数组而不是 map :

std::vector<std::pair<TKey, TValue>> items(keys.size());
std::transform(
        std::make_move_iterator(keys.begin()),
        std::make_move_iterator(keys.end()),
        std::make_move_iterator(values.begin()),
        items.begin(),
        (auto &&k, auto &&v) { return std::pair{std::move(k), std::move(v); });

std::sort(items.begin(), items.end(), [](auto const &l, auto const &r) {
        return l.first < r.first;
});
// Now copy them back, like above.

Zip迭代器在这里可能很有用,但它不在STL中,因此只有库级别的解决方案。

关于c# - C++等效于C#Array.Sort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62344183/

相关文章:

c++ - 排序数组的问题

java - 使用 java 比较器但具有固定值的对象排序应该在排序列表中的最后一个值中

javascript - 如何对 greasemonkey 中的现有表格进行排序?

c# - 在 Web API 中管理版本

c# - c#中子命名空间的封装

c# - WPF 将文本框绑定(bind)到 ViewModel

c++ - 程序强制关闭管道一端的奇怪行为

c++ - CMake add_executable 目标名称已保留

c++ - 从源文件构建 gcc 时如何确定正确的头文件 (libstdc++-v3 build)

c# - Unity - 任意角度之间的夹具旋转