C ++如何一起使用 std::adjacent 和 std::count_if 来计算向量中条件的出现次数
Posted
技术标签:
【中文标题】C ++如何一起使用 std::adjacent 和 std::count_if 来计算向量中条件的出现次数【英文标题】:C++ how to use std::adjacent and std::count_if together, to count the number of occurrences of a condition in a vector 【发布时间】:2020-09-17 11:37:30 【问题描述】:在 C++ 中,我有一个接受对象向量的类成员函数。
从每两个连续的对象中,我创建一个 std::pair
我想做的是计算向量中 A 的对大于 B 的次数。
我尝试使用 std::count_if 进行此操作,但它不接受谓词中的 2 个参数。
所以我开始不使用 std::adjacent_find。
如何扩展我必须实际计算 A 的对大于 B 的次数?
int mv::class::countOccurances(std::vector<OpListIterator>& sortedops)
std::adjacent_find(sortedops.begin(), sortedops.end(),
[](opListIterator a, opListIterator b)
std::pair<unsigned,unsigned> A (a->get<unsigned>("Level1"),a->get<unsigned>("Level2"));
std::pair<unsigned,unsigned> B (b->get<unsigned>("Level1"),b->get<unsigned>("Level2"));
return A > B;
);
【问题讨论】:
如果您不编辑矢量,给用户const std:vector&
一个好主意
所以OpListIterator
是std::pait<unsigned, unsigned>
?
这似乎是一个 XY 问题
嗯...你定义>
为std::pair
s 吗?
不清楚你想在这里做什么。你能添加一些输入和期望输出的例子吗?
【参考方案1】:
好吧,据我了解,这里的问题在于未定义较少的运算符,所以这里是示例解决方案。
int mv::class::countOccurances(const std::vector<OpListIterator>& sortedops)
std::count_if(sortedops.begin(), sortedops.end(),
[](const opListIterator& a, const opListIterator& b)
std::pair<unsigned,unsigned> A (a->get<unsigned>("Level1"),a->get<unsigned>("Level2"));
std::pair<unsigned,unsigned> B (b->get<unsigned>("Level1"),b->get<unsigned>("Level2"));
return ( A.first == B.first ? A.second < B.second : A.first < B.first);
);
【讨论】:
【参考方案2】:首先简化,让我们介绍投影函数:
std::pair<unsigned, unsigned> projection(opListIterator it)
return it->get<unsigned>("Level1"), it->get<unsigned>("Level2");
你可能会用那个奇怪的谓词滥用std::adjacent_find
:
int count = 0;
std::adjacent_find(sortedops.begin(), sortedops.end(),
[&](opListIterator current, opListIterator next)
count += projection(current) > projection(next);
return false; // never considered as equal
);
return count;
正确的使用方法是:
int count = 0;
auto it = sortedops.begin();
while (it != sortedops.end())
it = std::adjacent_find(it, sortedops.end(),
[&](opListIterator current, opListIterator next)
return projection(current) > projection(next);
);
if (it != sortedops.end()) ++count; ++it;
return count;
对于std::count_if
,范围(ranges-v3 或 C++20)可能会有所帮助:
auto range = ranges::view::zip(sortedops, sortedops | ranges::view::drop(1)); // current/next pairs
return std::count_if(begin(range), end(range), [](const auto& p)
return projection(p.first) > projection(p.second);
);
【讨论】:
以上是关于C ++如何一起使用 std::adjacent 和 std::count_if 来计算向量中条件的出现次数的主要内容,如果未能解决你的问题,请参考以下文章
如何将 C typedef 结构和函数与 Rust 中的结构一起使用?
C#如何将实体框架实体与ObservableCollection一起使用