提问人:Damir Tenishev 提问时间:11/12/2023 最后编辑:Damir Tenishev 更新时间:11/12/2023 访问量:104
STL 中是否有像 std::unique 这样的算法来存储相等对象的数量?
Is there an algorithm in STL like std::unique which stores the amount of equal objects?
问:
std::unique 算法在连续的元素组中仅保留唯一元素。同时,有时了解初始容器中有多少特定元素是很有用的。喜欢用元素的数量及其数量进行卷积。
STL 中是否有这样的算法或一些简单的方法来做到这一点,而不考虑从头开始编写整个代码(这很容易,但我想尽可能多地重用现有解决方案)并避免额外的容器,例如 等?关键是要有一个简单明了的解决方案,比如 .std::unordered_map
std::equal
似乎使用额外的迭代器来写入金额或使用将存储值及其金额的位置。std::unique
std::unique
std::pair
first
second
例如
对于容器
[1, 1, 2, 2, 1, 1]
因此,我希望有两个容器 [1,2,1] 和 [2,2,2],其中第一个保留值,第二个容器将它们的数量保存在连续的组中(在这种情况下,[1,2] 和 [4,2] 可能是一个选项,但这是一个略有不同的主题)或一个容器,如 [{1,2}, {2,2}, {1,2}]。
答:
4赞
康桓瑋
11/12/2023
#1
在 的帮助下,您可能希望使用 views::chunk_by
<ranges>
auto l = {1, 1, 2, 2, 1, 1};
auto r = l | std::views::chunk_by(std::ranges::equal_to{})
| std::views::transform([](auto chunk) {
return std::pair{chunk.front(), chunk.size()};
});
如果需要分别收集数字和金额,可以使用 views::keys/views
::values
auto numbers = r | std::views::keys;
auto amounts = r | std::views::values;
评论
0赞
Damir Tenishev
11/12/2023
谢谢。这个很符合我的需求。两个问题。(1) 使用这种实现,在大量数据(千兆字节)上的性能不会比简单的暴力循环差吗?我的意思是,这个管道会根据性能生成代码吗?从提供的演示及其代码中很难一目了然。从性能角度来看,是否有任何可能的水下石头,例如过多的副本、中间分配等?(2) 有没有办法实现类似的结果,它将返回两个单独的容器 - 带有数字和金额?
1赞
康桓瑋
11/12/2023
@DamirTenishev我不认为这里有可观察到的性能影响,视图不存储数据,因此不涉及分配。没有必要使用涉及动态分配的容器,只需使用即可获取不同的视图。views::keys/views::values
0赞
Toby Speight
11/13/2023
@Danir,这里介绍的 THE 在 _input_range 时可以正常工作,但分离并需要_forward_range,因此最好调整您的代码以接受对而不是单独的范围。r
l
numbers
amounts
评论
[1, 1, 2, 2, 1, 1]