首页 > 解决方案 > C++ 等效于 C# Array.Sort

问题描述

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

标签: c#c++sorting

解决方案


您提供的文档链接没有说明算法的复杂性(毫不奇怪,考虑到该公司提供必要信息的能力有多好)。一般来说,如果没有额外的 O(N) 空间,这看起来是不可行的。评论中链接的 Konrad 解决方案可能是最便宜的解决方案,但如果您的数组元素很小且微不足道,您可以通过例如简单地将它们放在地图中来对它们进行排序:

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

(可以使用两个 one-linerstd::transform代替第二个循环,一个复制键,另一个复制值。)

或者一个数组而不是一个地图:

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 中,所以只有库级别的解决方案。


推荐阅读