C++ vector - find ("нет совпадения для 'operator =='")

Так что я довольно новичок в C++, поэтому я хотел пройтись по многомерному вектору, который у меня есть, но я получаю такие ошибки, как

stl_algo.h

error: no match for 'operator==' (operand types are std::vector<std::basic_string<char> >' and 'const std::basic_string<char>'

Есть много ошибок, вот код:

mClass.h

std::vector<std::vector<std::string> > aData;

mClass.cpp

bool mClass::checkVector(std::string k)
{
    if (std::find(mClass::aData.begin(), mClass::aData.end(), k) != mClass::aData.end())
    {
        return true;
    }
    return false;
}

3 ответа

Решение

mClass::aData.begin() а также mClass.aData.end() возвращать итераторы по векторам, а не итераторы по строкам. Здесь нет operator == сравнить vector и string, Отсюда и ошибка.

Вам нужно будет перебрать vectors. Предполагая, что у вас есть поддержка C++11:

bool mClass::checkVector(std::string const& k)
{
  for (auto const& vec : aData) { // Each `vec` is a std::vector<std::string>
    for (auto const& str : vec) { // Each `str` is a std::string
      // compare string represented by it2
      if (str == k) {
        return true;
      }
    }
  }
  return false;
}

Решение (pre-C++11) - сначала пройтись по векторам:

Обратите внимание на typedef для удобства.

typedef std::vector<std::vector<std::string> > vvec;
bool mClass::checkVector(std::string k)
{
    for(vvec::const_iterator it=mClass::aData.begin(), end=mClass::aData.end();it!=end;++it){
        const std::vector<std::string>& inner=*it;
        if (std::find(inner.begin(), inner.end(), k) != inner.end())
        {
            return true;
        }
    }
    return false;
}

Поскольку у вас есть многомерный массив, вы не можете использовать итератор для просмотра каждого значения, поэтому лучший способ сделать это - сначала сделать цикл

for(std::vector<std::vector<std::string> >::iterator it = Class::aData.begin(); it!=mClass::aData.end(); ++it)
    if (std::find(it->begin(), it->end(), k) != it->end())
    {
        return true;
    }
return false;

Ты можешь использовать std::find только на самом низком уровне итератора, а не на итераторе для полного вектора.

Другие вопросы по тегам