Как найти вектор внутри вектора - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь написать программу, которая должна искать наличие вектора внутри вектора:

#include <iostream>
#include <algorithm>    
#include <vector>  
#include <string>

struct B
{
    std::vector<int> a;
};

struct A
{
    std::vector<B> a;
    int x;
    std::string n;
};

int main()
{
    A s;
    B b1,b2, b3;
    b1.a.push_back(10);
    b1.a.push_back(29);
    b2.a.push_back(50);
    b2.a.push_back(69);
    s.a.push_back(b1);
    s.a.push_back(b2);
    std::vector<int> a22;
    b3.a.push_back(10);
    b3.a.push_back(29);
    auto it = std::search(s.a.begin(), s.a.end(), b3.a.begin(), b3.a.end());
    if (it != s.a.end())
        std::cout << "Element found in vector\n";
    else
       std::cout << "Element not found in vector\n";
   return 0;
}

Но когда я компилирую код, я получаю много ошибок:

$ c++ -std=c++11 try66.cpp
In file included from C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/stl_algobase.h:71:0,
                 from C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/char_traits.h:39,
                 from C:/tools/mingw64/x86_64-w64-mingw32/include/c++/ios:40,
                 from C:/tools/mingw64/x86_64-w64-mingw32/include/c++/ostream:38,
                 from C:/tools/mingw64/x86_64-w64-mingw32/include/c++/iostream:39,
                 from try66.cpp:1:
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/predefined_ops.h: In instantiation of 'bool __gnu_cxx::__ops::_Iter_equal_to_iter::operator()(_Iterator1, _Iterator2) const [with _Iterator1 = __gnu_cxx::__normal_iterator<B*, std::vector<B> >; _Iterator2 = __gnu_cxx::__normal_iterator<int*, std::vector<int> >]':
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/stl_algo.h:237:37:   required from '_ForwardIterator1 std::__search(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _ForwardIterator2, _BinaryPredicate) [with _ForwardIterator1 = __gnu_cxx::__normal_iterator<B*, std::vector<B> >; _ForwardIterator2 = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _BinaryPredicate = __gnu_cxx::__ops::_Iter_equal_to_iter]'
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/stl_algo.h:4023:47:   required from '_FIter1 std::search(_FIter1, _FIter1, _FIter2, _FIter2) [with _FIter1 = __gnu_cxx::__normal_iterator<B*, std::vector<B> >; _FIter2 = __gnu_cxx::__normal_iterator<int*, std::vector<int> >]'
try66.cpp:31:71:   required from here
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/predefined_ops.h:86:23: error: no match for 'operator==' (operand types are 'B' and 'int')
       { return *__it1 == *__it2; }
                   ^

Я не уверен, какую вспомогательную функцию нам нужно создать для решения проблемы?

1 Ответ

0 голосов
/ 17 ноября 2018

В вашем коде "вы ищете int s в векторе B s".

Редактировать: Из ваших комментариев я понимаю, что вы хотите использовать std::find_first_of, а не метод поиска.Подробнее читайте в Разница между std :: search и std :: find_first_of .

Вы должны предоставить свой собственный предикат для std::search, чтобы помочь ссравнение, например, вот так:

#include <iostream>
#include <algorithm>    
#include <vector>  
#include <string>

struct B
{
    std::vector<int> a;
};

struct A
{
    std::vector<B> a;
    int x;
    std::string n;
};

bool mypredicate (B b, int value) {
    return std::find(b.a.begin(), b.a.end(), value) != b.a.end();
}


int main()
{
    A s;
    B b1,b2, b3;
    b1.a.push_back(10);
    b1.a.push_back(29);
    b2.a.push_back(50);
    b2.a.push_back(69);
    s.a.push_back(b1);
    s.a.push_back(b2);
    std::vector<int> a22;
    b3.a.push_back(10);
    b3.a.push_back(29);
    auto it = std::find_first_of(s.a.begin(), s.a.end(), b3.a.begin(), b3.a.end(), mypredicate);
    if (it != s.a.end())
        std::cout << "Element found in vector\n";
    else
       std::cout << "Element not found in vector\n";
   return 0;
}

Вывод:

Элемент найден в векторе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...