如果存在,那么C#数组的C++等价物是什么。sort
? 我看了一下C#函数的源代码,但我无法解出它。
您提供的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中,所以只能在库级解决方案中使用。