提问者:小点点

C#Array.Sort的C++等价物


如果存在,那么C#数组的C++等价物是什么。sort(tkey[],tvalue[],Int32,Int32)? 我看了一下C#函数的源代码,但我无法解出它。


共1个答案

匿名用户

您提供的doc链接没有提到算法复杂度(考虑到该公司在提供必要信息方面有多好,这并不令人意外)。 通常,如果没有至少一个额外的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;
}

(可以使用两个一行std::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 iterator在这里可能很有用,但是它不在STL中,所以只能在库级解决方案中使用。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c#array.sort|c++|等价物)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?