Почему ошибка не совпадает с 'operator ==' при использовании `std :: find`? - PullRequest
2 голосов
/ 28 апреля 2019

Я использую std::find, чтобы проверить, что строка не в std::vector<std::vector<string>>

Ошибка:

no match for 'operator==' (operand types are 'std::vector<std::__cxx11::basic_string<char> >' and 'const char [6]')

Разве это не тип не соответствует?

vector< vector< string>>data;

if(find(data.begin(), data.end(), "START") == data.end()){

    printf("Missing \"START\"\n");
    return true;`

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Причина сообщения об ошибке была хорошо объяснена в другом ответе.Я хотел бы предоставить решение этой проблемы.

Поскольку вы пытаетесь найти, , если какой-либо из элементов std::string в векторе вектора соответствует "START", выможет использовать стандартный алгоритм std :: any_of в сочетании с унарным предикатом , который возвращает std::find(vec.cbegin(), vec.cend(), str) != vec.cend();где vec - каждая строка вектора векторов. См. Демонстрацию здесь

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

bool isFound(const std::vector<std::vector<std::string>>& data, const std::string &str)
{
    const auto found_in_vector = [&str](const std::vector<std::string> & vec)-> bool {
        return std::find(vec.cbegin(), vec.cend(), str) != vec.cend(); // if found
    };

    if (std::any_of(data.cbegin(), data.cend(), found_in_vector))
    {
        std::cout << "Found\n";
        return true;
    }

    std::cout << "Missing \""<< str << " \"\n";
    return false;
}
int main()
{
    std::vector<std::vector<std::string>> data;
    std::vector<std::string> test{ "START","test" }; 
    data.emplace_back(test);

    std::cout << std::boolalpha << isFound(data, std::string{ "START" } );
}
1 голос
/ 28 апреля 2019

Да и нет.Ошибка вызвана тем, что у вас есть «вектор векторов строк», то есть слишком много одного измерения.Определите data, используя вместо этого std::vector<std::string>, и он будет работать.

Но почему ошибка говорит об отсутствующих операторах?

Когда вы используете std::find(), обычно это реализуется как макросили шаблонная функция, которая выполняет реальную работу, а не предварительно скомпилированная функция времени выполнения где-то в библиотеке.Это позволяет полной оптимизации компилятора на основе фактических типов ваших параметров.

Что он на самом деле делает - поскольку ваш контейнер является классом - пытается найти специальную функцию-член std::vector<std::vector<std::string>>::operator==(const char*).Это не реализовано напрямую, обычно это шаблон, но здесь это не важно.Важным фактом является то, что он не найдет ни одной версии operator==() с аргументом, который каким-то образом может принять переданную строку, либо напрямую, либо посредством преобразования.Причина этого в том, что ваш вектор содержит векторы, поэтому единственным допустимым аргументом будет другой вектор строк.

...