【问题标题】:Algorithm not working on const_iterator for non-const object算法不适用于非常量对象的 const_iterator
【发布时间】: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 给我。 spacenot_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&amp; s 的别名,或使用cbegin()cend()

标签: c++


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-05
    • 2012-11-14
    • 1970-01-01
    • 2016-07-18
    • 2017-09-18
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多