Проблема сравнения векторов STL

С вектором, определенным как std::vector<std::string>, интересно, почему следующее верно:

if ( vecMetaData[0] != "Some string" ) 
{
    ...

Но не это:

switch ( vecMetaData[1] )
{
    ...

Visual studio жалуется:

ошибка C2450: выражение переключения типа 'std :: basic_string ‹_Elem, _Traits, _Ax>' недопустимо 1> с 1> [1> _Elem = char, 1> _Traits = std :: char_traits, 1> _Ax = std :: распределитель 1>] 1> Нет доступного оператора преобразования, определяемого пользователем, который мог бы выполнить это преобразование, или оператор не может быть вызван


person Konrad    schedule 21.11.2008    source источник


Ответы (6)


switch () нужен интегральный тип (например, int, char, ...)

строка не является целочисленным типом, и строка не имеет неявного преобразования в целочисленный тип, поэтому ее нельзя использовать в операторе переключения.

person Pieter    schedule 21.11.2008

Это верно, потому что первый вызовет оператор! = Std :: string, который примет в качестве аргумента const char *. Это, однако, не означает, что std :: string также имеет оператор some_integral_type (), который будет возвращать интегральное выражение, необходимое переключателю.

Использование операторов в C ++ не обязательно вызывает встроенное значение. Ваш код, например, не сравнивает значения указателей. Он может вызывать определенную пользователем (в данном случае функцию std :: string) операторную функцию.

person Johannes Schaub - litb    schedule 21.11.2008

Вы можете использовать переключатель только для основных типов данных (int, char и т. Д.).

person schnaader    schedule 21.11.2008

Самая простая альтернатива BTW - это std::map<std::string, boost::function> StringSwitch;

Это позволяет вам сказать StringSwitch["Some string"](arguments...)

person MSalters    schedule 21.11.2008

ни один из них, вероятно, не то, что вы хотите в любом случае ... поскольку я предполагаю, что вы хотите использовать функцию std :: string :: compare для сравнения строк

person Community    schedule 01.12.2008

Если вы просто хотите проверить каждую вещь в векторе, вы можете использовать _1 _ стандартная библиотечная функция. Или, если вы хотите работать с подмножеством возможных значений, используйте find_if, чтобы получить итераторы для соответствующих элементов, а затем используйте цикл или for_each, чтобы воздействовать на них.

person Reed Hedges    schedule 21.11.2008