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 (Level1, Level2)。

我想做的是计算向量中 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&amp; 一个好主意 所以OpListIteratorstd::pait&lt;unsigned, unsigned&gt;? 这似乎是一个 XY 问题 嗯...你定义&gt;std::pairs 吗? 不清楚你想在这里做什么。你能添加一些输入和期望输出的例子吗? 【参考方案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 中与 Linux 一起使用共享内存

如何将 C typedef 结构和函数与 Rust 中的结构一起使用?

如何在目标 c 中模拟类方法以与 TDD 一起使用

C#如何将实体框架实体与ObservableCollection一起使用

如何将Objective C与applescript一起使用

如何从 Unix 命令行安装 c 和 c++ 编译器,然后与 Eclipse 一起使用?