算法不适用于非常量对象的const_iterator

Algorithm not working on const_iterator for non-const object

本文关键字:const iterator 对象 常量 不适用 适用于 非常 算法      更新时间:2023-10-16

我正在从这本名为《加速C++》的书中学习C++。一个章节有这个函数"split",它从"getline"读取一个字符串,并返回一个填充有分隔单词的向量。

vector<string> split(string s)
{
vector<string> ret;
typedef string::const_iterator iter;
iter i = s.begin();
while(i != s.end())
{   
i = find_if(i,s.end(),not_space);
iter j = find_if(i,s.end(),space);
if(i != s.end())
ret.push_back(string(i,j));
i = j;
}   
return ret;
}

略有不同的是,图书版本收集字符串作为常量引用。编译器显示find_if的参数不匹配的错误。但当我将split的参数更改为const或将迭代器更改为non_const时,它就起作用了。我不理解这种行为。我认为传递const_iterator只是意味着接收它的函数不能修改对象。对象本身可以是传递函数中的non_const。请解释一下。

i是一个常量迭代器,但它是用可变迭代器初始化的。这是一个有效的转换。但find_if()的第二个参数没有发生这样的转换,它是由非常数string::end()返回的值,因此模板参数推导中的类型不匹配。

您提到的任何一个更改都会使两个迭代器的类型相同;const或非常数。在这种情况下,模板参数推导不会出现问题。