使用find_if调试断言向量迭代器而不是dereferncable

时间:2017-04-26 21:35:17

标签: c++

我想将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;
    //}
}

有人可以帮我吗?

2 个答案:

答案 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()