Почему я не могу передать cend () и cbegin () в count_if?

Я пытаюсь подсчитать количество строк, длина которых больше 6 в векторе. Это довольно просто, но я пытаюсь сделать это с помощью count_if в algorithm библиотека. Итак, вот мой код:

int string_size_check(const std::vector<std::string> &v, unsigned int size){
return std::count_if(v.begin(), v.end(), [size] (std::string &s)->bool{ return s.size() > size; });
}

int main(){
std::vector<std::string> v = { "abc", "abcd", "abcde", "abcdef", "abcdefg", "abcdefg" };
std::cout << string_size_check(v, 6);
}

string_size_check это функция для этого. Я использовал лямбду для предиката.
Этот код не скомпилирован. Проблема была с const в первом параметре. begin а также end вернусь const итераторы, когда он вызывается на const вектор. Так что это эффективно cbegin а также cend Когда я удаляю const оно работает. Я сделал параметр const потому что AFAIK count_if не меняет содержимое в контейнере.
Я понятия не имею, почему прохождение const Итераторы count_if не будут работать.
РЕДАКТИРОВАТЬ: Вот сообщение об ошибке в визуальной студии 2013

    c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(97): error C2664: 'bool string_size_check::<lambda_fed0cfd76fd966b8c62fe345d7e88af2>::operator ()(std::string &) const' : cannot convert argument 1 from 'const std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'std::string &'
1>          Conversion loses qualifiers
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(109) : see reference to function template instantiation 'std::iterator_traits<const std::basic_string<char,std::char_traits<char>,std::allocator<char>> *>::difference_type std::_Count_if<const std::basic_string<char,std::char_traits<char>,std::allocator<char>>*,_Pr>(_InIt,_InIt,_Pr)' being compiled
1>          with
1>          [
1>              _Pr=string_size_check::<lambda_fed0cfd76fd966b8c62fe345d7e88af2>
1>  ,            _InIt=const std::basic_string<char,std::char_traits<char>,std::allocator<char>> *
1>          ]
1>          c:\users\enter\documents\visual studio 2013\projects\win32test\win32test\source.cpp(7) : see reference to function template instantiation '__w64 int std::count_if<std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,string_size_check::<lambda_fed0cfd76fd966b8c62fe345d7e88af2>>(_InIt,_InIt,_Pr)' being compiled
1>          with
1>          [
1>              _InIt=std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>
1>  ,            _Pr=string_size_check::<lambda_fed0cfd76fd966b8c62fe345d7e88af2>
1>          ]

1

Решение

Вы правы, так как ваш vector является constваши итераторы тоже будут const,

Но, следовательно, параметр предикатной функции также должен быть const,

Тебе нужно: const std::string &s

4

Другие решения


По вопросам рекламы [email protected]