2013-05-27 4 views
0

У меня есть работающая (ну, по-строительству, но WIP, тем не менее) игра, которую я закодировал на C#, используя XNA некоторое время назад, и теперь я конвертирую игру в C++. При преобразовании некоторых из моих методов я сталкиваюсь с ошибкой, что я не могу найти что-либо, эквивалентное некоторым из методов Array, таких как FindAll, Find и Exists. Я использую векторы и любую помощь по эквивалентному методу, и как реализовать это было бы очень полезно.C# to C++ Conversion: Поиск массивов

Например, в C# У меня было:

if (Array.Exists(tileList, tile => tile.Position.X == e.Position.X)) 

Где е был какой-то объект, TileList был массив всех плиток в игре, и плитка была, очевидно, плитка в массиве.

Как я мог создать что-то с почти идентичной функцией в C++?

+1

Соответствующие алгоритмы в заголовке '' '' (http://en.cppreference.com/w/cpp/algorithm/find). Можно ли использовать лямбда-выражение (как и в C#), зависит от того, можете ли вы использовать C++ 11 (синтаксис будет немного отличаться от этого). – jogojapan

ответ

2

Похоже, вы, вероятно, хотите что-то вроде:

if (std::any_of(tileList.begin(), tileList.end(), 
       [](tile e) { return tile.position.X == e.Position.X; })) 
    // whatever 

Если у вас есть старый компилятор (std::any_of был добавлен в C++ 11, так что старые компиляторы не имеют его), вы можете использовать std::find или std::find_if. Как вы, вероятно, догадались бы, они попытаются найти местоположение соответствующего элемента, а не просто сказать, существует ли он, поэтому он будет немного неуклюже использовать, но не так резко (в основном, вам нужно сравнить возвращаемые позицию против tileList.end(), чтобы узнать, есть ли у вас матч или нет).

+0

Спасибо, это сработало отлично. Тем не менее, поскольку tile является настраиваемым классом, теперь он сообщает об ошибке, что не найдено никакого оператора ==, который берет левый тип плитки, хотя я никоим образом не пытаюсь использовать оператор == на плитка. Что может быть решением этого? – Oracular

+0

Один из способов - определить 'operator ==' для вашего класса 'Tile', что-то вроде:' bool operator == (Tile const & other) {return position.X == other.position.X; } '. –

+0

Я только что попробовал это. Я получаю эту ошибку до сих пор, и, как и раньше, (хотя я не упоминал их), я получаю «никакого преобразования из const my_func :: в Tile», а также «==»: незаконно для класса , Все ошибки отображаются в некоторых файлах «xutility», с которыми я никогда не сталкивался раньше. – Oracular