c# - C++ 等效于 C# Array.Sort
问题描述
如果存在,C# 的 C++ 等价物是Array.Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)
什么?我查看了 C# 函数的源代码,但无法解决。
解决方案
您提供的文档链接没有说明算法的复杂性(毫不奇怪,考虑到该公司提供必要信息的能力有多好)。一般来说,如果没有额外的 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 中,所以只有库级别的解决方案。
推荐阅读
- android - 如何在 Ionic 应用程序中设置 Android 构建版本?
- python - ModuleNotFoundError:没有名为“bs4”的模块 [BeautifulSoup]
- java - 如何在 JOptionPane.showInputDialog 中添加变量
- angular - 仅在构建中导入 Angular 材料时出错
- javascript - 加载jsp页面耗时过长
- documentum - 如何使用 Documentum 中的 DQL 获取文件柜中已删除的文档列表?
- github - 使用 Heroku 部署的 Jhipster 应用程序,但在连接到 github 构建后未触发
- javascript - 如何将数组中相邻的数字组合成单个数字并返回一个包含“5”、“6”、“7”、“8”、“9”、“10”、“11”的数组?
- amazon-web-services - AWS S3 选择获取名称中带有 / 的列的数据
- pandas - 未与 X 轴刻度对齐的条形和散景图中的第一个条形截止