2016-04-25 4 views
0

Так у меня есть вектор кортежа координат производится с помощью следующего кода:использование станд :: найти найти зЬй :: кортеж в станд :: вектор

vector<tuple<int, int>> coordinates; 
for (int i = 0; i < 7; i++){ 
    for (int j = 0; j < 6; j++){ 
     coordinates.push_back(make_tuple(i, j)); 
    } 
} 

Я пытаюсь заполнить доску с «x», «o» или «.». со следующим:

void displayBoard(vector<tuple<int,int>>& board, vector<tuple<int,int>>& p1, vector<tuple<int,int>>& p2){ // prints out board 
    cout << " a b c d e f g\n"; // top row 
    for (int i = 1; i < 43; i++){ 
    if (i % 7 == 0) { 
     if (find(p1.begin(), p1.end(), board[i])) cout << "| x |\n"; 
     else if (find(p2.begin(), p2.end(), board[i])) cout << "| o |\n"; 
     else cout << "| . |\n"; 
    } else { 
     if (find(p1.begin(), p1.end(), board[i])) cout << "| x "; 
     else if (find(p2.begin(), p2.end(), board[i])) cout << "| o "; 
     else cout << "| . "; 
    } 
    } 
} 

мой INT главный выглядит следующим образом:

int main() { 
    vector<tuple<int, int>> coordinates; 
    for (int i = 0; i < 7; i++){ 
    for (int j = 0; j < 6; j++){ 
     coordinates.push_back(make_tuple(i, j)); 
    } 
    } 
    vector<tuple<int,int>> p1 = {make_tuple(0,1)}; 
    vector<tuple<int,int>> p2 = {make_tuple(3,1)}; 
    displayBoard(coordinates, p1, p2); 
    return 0; 
} 

Я (0,1) и (3,1) в качестве тест-координаты, чтобы увидеть, если код будет работать , Короче говоря, я хотел использовать std :: find, чтобы определить, была ли выбрана координата кортежа с помощью p1 или p2 и соответствующим образом форматировать выводимую строку. Итак, если бы std::find_if(p1.begin(), p1.end(), make_tuple(2,2)) было правдой, чтобы поместить ячейку с «х», например. Проблема я получаю следующее сообщение об ошибке при компиляции:

error: could not convert ‘std::find<__gnu_cxx::__normal_iterator<std::tuple<int, int>*, std::vector<std::tuple<int , int> > >, std::tuple<int, int> >((& p2)->std::vector<_Tp, _Alloc>::begin<std::tuple<int, int>, std::allocator<std::tuple<int, int> > >(), (& p2)->s td::vector<_Tp, _Alloc>::end<std::tuple<int, int>, std::allocator<std::tuple<int, int> > >(), (*(const std::tuple<int, int>*)(& board)->std::vector<_ Tp, _Alloc>::operator[]<std::tuple<int, int>, std::allocator<std::tuple<int, int> > >(((std::vector<std::tuple<int, int> >::size_type)i))))’ from ‘__ gnu_cxx::__normal_iterator<std::tuple<int, int>*, std::vector<std::tuple<int, int> > >’ to ‘bool’

Таким образом, вопрос, могу ли я использовать зЬй :: find_if найти зЬй :: кортеж в качестве станд :: вектор. И если нет, то как вы можете найти кортеж в векторе.

Примечание: я включил: iostream, строку, кортеж, вектор и алгоритм и использую пространство имен std.

+1

http://en.cppreference.com/w/cpp/algorithm/find - см. Возвращаемое значение –

+0

спасибо за ссылку, по-прежнему получаю аналогичную ошибку, используя std :: find_if хотя –

+1

Я ничего не говорил о используя 'std :: find_if' (эта страница касается как' std :: find', так и 'std :: find_if'), я сказал, прочитав раздел Возвращаемое значение, потому что вы, кажется, смущены тем, что' std :: find' возвращается. –

ответ

5

Ваша проблема не ищет кортеж в векторе. Ваш поиск в порядке.

Ваша проблема заключается в том, что std::find возвращает либо итератор найденному члену последовательности, либо конечное значение итератора.

Ваш код предполагает, что std::find() возвращает bool указание на то, что это значение найдено. Это неправда. std::find() возвращает итератор. Либо итератор, либо найденное значение, или конечное значение итератора.

+1

Это не имеет никакого отношения к 'find()' versus 'find_if()'. И 'find()', и 'find_if()' ведут себя одинаково в этом отношении. Кроме того, вы только ухудшили ситуацию. Третий параметр 'find_if'() - это лямбда или объект-функция, а не значение. Ваше первоначальное использование 'find()' было правильным. Ваша проблема не правильно обрабатывала возвращаемое значение. Повторите мой ответ. –

+0

ах я вижу, возвращает итератор не логическое мое плохое спасибо –

0

Вы можете использовать find_if следующим образом:

int main() 
{ 
vector<tuple<int, int>> coordinates; 
coordinates.push_back(make_tuple(0,1)); 
coordinates.push_back(make_tuple(2,3)); 

auto t = make_tuple(2,3); 

auto it = std::find_if(coordinates.begin(), coordinates.end(), [&t](const auto& item) { 
    return std::get<0>(t) == std::get<0>(item) 
      && std::get<1>(t) == std::get<1>(item); 
    }); 

    if(it!=coordinates.end()) 
     cout << "found" << endl; 
} 

возвращает итератор к найденному последовательности, или конечным итератора, если он не нашел элемент, который вы ищете.

Смежные вопросы