2016-04-25 19 views
0

だから私は、タプルのベクトルは、次のコードを使用して作られた座標を持っているを見つけるために見つけます'x'、 'o'、または '。'のいずれかで始まります。次のように使用のstd :: STDでのstd ::タプル::ベクトル

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))が真であれば、セルに 'x'を記入してください。コンパイルするときの問題は、私は次のエラーを取得された:iのstd ::ベクトル中のstd ::タプルを見つけるためにはstd :: find_ifを使用できるかどう

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’

がそこで質問です。そしてもしそうでなければ、ベクトル内のタプルを見つけることはできません。

注: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()'と 'find_if()'とは関係ありません。この点で 'find()'と 'find_if()'は同じように動作します。しかも、あなたはそれを悪化させただけです。 'find_if'()の3番目のパラメータはラムダまたは関数オブジェクトであり、値ではありません。あなたの最初の '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; 
} 

関連する問題