在2D向量C ++中计算struct元素

时间:2016-10-20 09:38:48

标签: c++ vector

我有这种类型结构的2D矢量

typedef struct box
{   
    int boxVal;
    char boxTakenBy;
} box;

我将myvector定义为:

vector<vector<box> > myvector(10,vector<box>(10))

我的目标是使用boxTakenBy == 'X'计算元素数量。我试过了:

int mycount =  std::count_if( myvector.begin(), myvector.end(),
[](const box &p ) { return p.boxTakenBy == 'X'; });

我收到编译错误:

no match for call to ‘<lambda(const box&)>) (std::vector<box >&)

不确定我的方法是错误还是只是语法。如果您发现任何语法问题或建议是否有更好的方法,请更正。

4 个答案:

答案 0 :(得分:3)

正如myvector box所提及的那些元素不是vector<box>而是myvector s。所以你需要做的就是迭代== 'X'的两个维度。

你可以结合hauron(累积总和)和std::accumulate(计算满足你条件的内部元素(#include <vector> #include <algorithm> #include <iostream> #include <numeric> struct box { int boxVal; char boxTakenBy; }; int main(){ using namespace std; vector<vector<box> > myvector(10, vector<box>(10)); myvector[0][0].boxTakenBy = 'X'; myvector[2][0].boxTakenBy = 'X'; myvector[2][7].boxTakenBy = 'X'; myvector[5][7].boxTakenBy = 's'; int total_count = std::accumulate(myvector.begin(), myvector.end(), 0, [](int acc, const vector<box>& curr) { return acc + std::count_if(curr.begin(), curr.end(), [](const box& b ) { return b.boxTakenBy == 'X'; }); } ); std::cout << total_count << '\n'; } )来实现这一目标:

ImageView

std::count_if

答案 1 :(得分:3)

你有两个级别的向量,所以你需要遍历两个。

您可以使用count_if来计算每个&#34;内部&#34;中的元素。向量,然后将结果与accumulate

相加
int count = std::accumulate(myvector.begin(),
                            myvector.end(),
                            0,
                            [](int i, const vector<box>& bs)
                            { return i + std::count_if(bs.begin(),
                                                       bs.end(),
                                                       [](const box& b) 
                                                       { return b.boxTakenBy == 'X';}); });

或者,拉出最里面的函数并抽象出角色:

auto takenBy = [](char c) { return [=](const box& b) { return b.boxTakenBy == c; };};
int count = std::accumulate(myvector.begin(),
                            myvector.end(),
                            0,
                            [&](int i, const vector<box>& bs)
                            { return i + std::count_if(bs.begin(),
                                                       bs.end(),
                                                       takenBy('X')); });

答案 2 :(得分:1)

另一种解决方案可以是使用std::for_eachstd::count_if,如下所示:

int mycount;
std::for_each( myvector.begin(), myvector.end(), 
 [&mycount](std::vector<box> const &p ) 
  { mycount += std::count_if(p.begin(),p.end(),[](box const & q){return q.boxTakenBy == 'X'; });
  });

答案 3 :(得分:0)

标准库算法很棒,但有时候我认为基于范围的for循环更简单:

auto mycount = 0;
for(const auto& row : myvector)
  for(auto& item: row)
    if (item.boxTakenBy == 'X') ++mycount;

Live demo