【发布时间】:2019-11-15 18:16:42
【问题描述】:
我正在从这本名为 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。请解释一下。
【问题讨论】:
-
请写出编译器显示的确切错误。
-
它works 给我。
space和not_space到底是什么?此外,确切的错误消息将使这更容易。 -
@ 有问题的 split.cpp:在函数'std::vector<:__cxx11::basic_string> > split(std::string)'中:split.cpp:30:33:错误:没有匹配函数调用'find_if(iter&, std::__cxx11::basic_string
::iterator, bool (&)(char))' 30 | i = find_if(i,s.end(),not_space); -
@HolyBlackCat 我编辑了我的问题。我错误地粘贴了书本版本。 space 和 not_space 只是 C 库中 isspace 和 !isppace 的包装器。
-
将
s设为常量,或使用const&s 的别名,或使用cbegin()和cend()。
标签: c++