我的代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct A
{
int index;
A(int p_i) : index(p_i) {}
};
struct B
{
int index;
B(int p_i) : index(p_i) {}
};
int main(int argc, const char * argv[])
{
vector<A> tmp_v_x { A(5), A(6), A(3) };
B tmp_array_b[3] = { B(6), B(5), B(3) };
for(unsigned short int i = 0; i < 3; ++i)
{
if(std::find_if(tmp_v_x.begin(), tmp_v_x.end(), [&p_1 = tmp_array_b[i]](const A& p_2) -> bool { return p_1.index == p_2.index; }) == tmp_v_x.end())
{
cout << "Mismatch" << endl;
}
}
return 0;
}
我收到了一个错误:
error: lambda capture initializers only available with -std=c++1y or -std=gnu++1y [-Werror]
这是因为我的编译器没有得到对C ++ 14的支持。我怎样才能改进它可以在编译器上运行的代码,而编译器只支持C ++ 11? 我不想改变这段代码的语义。感谢。
答案 0 :(得分:1)
您可以在lambda:
之前声明变量auto& p_1 = tmp_array_b[i];
if (std::find_if(tmp_v_x.begin(), tmp_v_x.end(),
[&p_1](const A& p_2) -> bool { return p_1.index == p_2.index; })
== tmp_v_x.end())
因为局部变量p_1
的寿命比你的lambda长。
答案 1 :(得分:1)
这是另一种可能性:捕获tmp_array_b和i
int main(int argc, const char * argv[])
{
vector<A> tmp_v_x{ A(5), A(6), A(3) };
B tmp_array_b[3] = { B(6), B(5), B(3) };
for (unsigned short int i = 0; i < 3; ++i)
{
if (std::find_if(tmp_v_x.begin(), tmp_v_x.end(), [&tmp_array_b, i](const A& p_2) -> bool { return tmp_array_b[i].index == p_2.index; }) == tmp_v_x.end())
{
cout << "Mismatch" << endl;
}
}
return 0;
}
答案 2 :(得分:1)
您有一个索引变量i
用于索引tmp_array_b
。使用基于范围的for
并在那里捕获循环变量。
B tmp_array_b[3] = { B(6), B(5), B(3) };
for(auto& tmp_val : tmp_array_b)
{
if(std::find_if(tmp_v_x.begin(), tmp_v_x.end(), [&tmp_val](const A& p_2) -> bool { return tmp_val.index == p_2.index; }) == tmp_v_x.end())
{
cout << "Mismatch" << endl;
}
}