gpt4 book ai didi

c++ - 为什么我不能将 cend() 和 cbegin() 传递给 count_if?

转载 作者:行者123 更新时间:2023-11-30 01:50:17 24 4
gpt4 key购买 nike

我正在尝试计算 vector 中长度大于 6 的字符串的数量。这非常简单,但我正在尝试使用 algorithm 库中的 count_if 来完成。所以这是我的代码:

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 就是这个功能。我为谓词使用了 lambda。
此代码未编译。问题在于第一个参数中的 constbeginendconst vector 上调用时将返回 const 迭代器。所以它实际上是 cbegincend 当我删除 const 时它起作用了。我制作了参数 const 因为 AFAIK count_if 不会更改容器中的内容。
我不知道为什么将 const 迭代器传递给 count_if 不起作用。
编辑:这是 visual studio 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> ]

最佳答案

你是对的,因为你的 vectorconst,你的迭代器也将是 const

但是因此,谓词函数的参数也必须是const

你需要:const std::string &s

关于c++ - 为什么我不能将 cend() 和 cbegin() 传递给 count_if?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27640329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com