c++ STL中是否有类似std::unique的算法来存储相等对象的数量?

gcmastyq  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(65)

std::unique算法只在连续的元素组中保留唯一的元素。同时,有时知道初始容器中有多少个 * 特定 * 元素是有用的。比如用元素的数量和它们的数量进行卷积。
在STL中是否有这样的算法或一些直接的方法来做到这一点,而不考虑从头开始编写整个代码(这很容易,但我想尽可能地重用现有的解决方案),并避免额外的容器,如std::unordered_map等?关键是要有一个简单和直接的解决方案,如std::equal
它看起来像std::unique,带有额外的迭代器来写入数量,或者使std::uniquestd::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}]。

cwdobuhd

cwdobuhd1#

<ranges>的帮助下,您可能希望使用views::chunk_by

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

字符串
Demo
如果您需要分别收集数字和金额,可以使用views::keys/views::values

auto numbers = r | std::views::keys;
auto amounts = r | std::views::values;


Demo

相关问题