c++ - 算法不适用于非常量对象的 const_iterator
问题描述
我正在从这本名为 Accelerated 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;
}
略有不同的是,书本版本将字符串收集为 const 参考。编译器显示 find_if 的参数不匹配的错误。但是当我将 split 的参数更改为 const 或将 iterator 更改为 non_const 时,它可以工作。我不明白这种行为。我认为传递一个 const_iterator 只是意味着接收它的函数不能修改对象。对象本身在传递函数中可以是 non_const。请解释一下。
解决方案
i
是一个常量迭代器,但它是用一个可变迭代器初始化的。这是一个有效的转换。但是 的第二个参数没有发生这种转换find_if()
,它是 non-const 返回的值string::end()
,因此模板参数推导中的类型不匹配。
您提到的任何一项更改都使两个迭代器的类型相同;常量或非常量。在这种情况下,模板参数推导没有问题。
推荐阅读
- php - php正则表达式配对单词和数字
- symfony - 如何通过所有父节点的 id 获取一些子节点(DoctrineExtensions、Gedmo-Tree NestedTreeRepository、Symfony)
- python - 如何在 Django 的基于通用类的 ListView 中返回搜索词
- java - 我收到此“NullPointerException”错误
- c# - 如何使用 LINQ 表达式 ASP.NET MVC 实体框架使用外键更新多个表
- amazon-web-services - 是否可以更改 AWS cognito 托管 UI?
- macos - 是否有从 Finder (Mac) 自动创建 Google Drive 文件(文档或表格)的键盘快捷键?
- virtualbox - 为什么 Packer boot_command 中使用 esc 和 bs?
- r - 合并data.tables,同时保持R中的原始顺序
- vue.js - 在 vue.js 应用程序中,为什么 public 文件夹保留在 src 文件夹之外?