我想将for循环转换为find_if lambda,但我总是得到相同的结果向量迭代器而不是dereferncable。
void SearchObjectDescription(std::vector<std::string>& input, Player & player)
{
//--local variable
bool found = false;
//std::find_if
std::vector<std::string>::iterator i = std::find_if(input.begin(), input.end(),[&](Player player)
{
if ((player.InInventory((*i)) ) == true)
{
std::cout << (player.GetInventory().ItemByName((*i))).ExamineObject() << std::endl;
return true;
}
else
{
std::cout << "Object not in invetory!" << std::endl;
return false;
}
});
//original for loop
//for (std::vector<std::string>::iterator i = input.begin()+1; i != input.end(); i++)
//{
// if (player.InInventory((*i))== true)
// {
// std::cout << (player.GetInventory().ItemByName((*i))).ExamineObject() << std::endl;
// found = true;
// break;
// }
//}
//if (found ==false)
//{
// std::cout << "Object not in invetory!" << std::endl;
//}
}
有人可以帮我吗?
答案 0 :(得分:0)
你错误地想着lambda。 std::find_if
函数作为它的第三个参数,取一个带有向量元素的lambda,如果它是你搜索的元素则返回。
lambda的目的是取一个元素并判断它是否是正确的。
然而,你的lambda没有收到你的字符串向量的元素,但是以玩家为参数。但是你显然没有播放器列表,你有一个字符串列表。为什么要检查的元素应该是Player
?
相反,捕获您的播放器变量并接收要检查的元素。它看起来像这样:
void SearchObjectDescription(std::vector<std::string>& input, Player & player)
{
auto i = std::find_if(input.begin(), input.end(),[&](const std::string& item)
{
// item is equal to the current element being checked
// player is captured by reference because of [&]
// if the item `item` is in inventory, return true.
return player.InInventory(item);
});
if (i != input.end()) {
// if it's not equal to the end, *i is the found item.
}
}
请注意,在C ++ 14中,您可以在lambda中收到auto&&
,并将其推断为string&
:
std::find_if(input.begin(), input.end(), [&](auto&& item)
{
// type of item is std::string&
// ...
});
答案 1 :(得分:0)
你不能在lambda中使用using OxyPlot;
using OxyPlot.Series;
using OxyPlot.Axes;
public class MyViewModel
{
public PlotModel Model { get; set; }
public MyViewModel()
{
CategoryAxis xaxis = new CategoryAxis();
xaxis.Position = AxisPosition.Bottom;
xaxis.MajorGridlineStyle = LineStyle.Solid;
xaxis.MinorGridlineStyle = LineStyle.Dot;
xaxis.Labels.Add("Mon, 4/24");
xaxis.Labels.Add("Tue, 4/25");
xaxis.Labels.Add("Wed, 4/26");
xaxis.Labels.Add("Thu, 4/27");
LinearAxis yaxis = new LinearAxis();
yaxis.Position = AxisPosition.Left;
yaxis.MajorGridlineStyle = LineStyle.Dot;
xaxis.MinorGridlineStyle = LineStyle.Dot;
ColumnSeries s1 = new ColumnSeries();
s1.IsStacked = true;
s1.Items.Add(new ColumnItem(20));
s1.Items.Add(new ColumnItem(60));
s1.Items.Add(new ColumnItem(40));
s1.Items.Add(new ColumnItem(50));
ColumnSeries s2 = new ColumnSeries();
s2.IsStacked = true;
s2.Items.Add(new ColumnItem(50));
s2.Items.Add(new ColumnItem(30));
s2.Items.Add(new ColumnItem(10));
s2.Items.Add(new ColumnItem(20));
Model = new PlotModel();
Model.Title = "Xamarin Oxyplot Sample";
Model.Background = OxyColors.Gray;
Model.Axes.Add(xaxis);
Model.Axes.Add(yaxis);
Model.Series.Add(s1);
Model.Series.Add(s2);
}
}
迭代器,因为它在i
退出后才初始化。你需要使用lambda的输入参数,它来自std::find_if()
而不是std::string
对象的vector
。
此外,您不会检查Player
的返回值,以确保在解除引用之前有一个有效的迭代器。
您没有正确地将std::find_if()
循环转换为基于lambda的for
。试试这个:
std::find_if()