我有这种类型结构的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 >&)
不确定我的方法是错误还是只是语法。如果您发现任何语法问题或建议是否有更好的方法,请更正。
答案 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
答案 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_each
和std::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;