【问题标题】:return type for std::search()std::search() 的返回类型
【发布时间】:2011-12-22 07:44:38
【问题描述】:

我正在尝试测试 Stroustup 书中search() 的示例。

string quote("why waste time learning, when ignorance is instantaneous?");

bool in_quote(const string& s){
    char* p = search(quote.begin(), quote.end(), s.begin(), s.end());
    return p != quote.end();
}

void test(){
    bool b1 = in_quote("learning"); // b1=true
    bool b2 = in_quote("lemming"); // b2=false
}

但我收到以下错误:

error C2440: 'initializing' : cannot convert from
'std::_String_iterator<_Elem,_Traits,_Alloc>' to 'char *'

看起来返回类型不对。我也试过string::iterator,得到了同样的错误。那么,正确的类型应该是什么,它应该是容器的迭代器类型吗?谢谢

【问题讨论】:

  • 如果你有 C++11,使用auto。但看起来应该是std::string::iterator。当你尝试那个时,它的信息是什么?应该是不同的信息。
  • @ubbdd 迭代器不是指针。
  • 顺便打开“输出”窗口查看完整消息。它应该会告诉你_Elem 的类型

标签: c++ search stl


【解决方案1】:

string 的早期实现可以很容易地使用 char* 作为其迭代器类型,从而允许这个不正确的代码 sn-p 正确编译。 string::iterator 的大多数现代实现都具有正确的类类型,并且不能转换为 char*

std::search is的签名:

template <class ForwardIterator1, class ForwardIterator2>
   ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
                             ForwardIterator2 first2, ForwardIterator2 last2 );

如您所见,返回类型与传递给函数的前两个迭代器的类型相同。在您的情况下,string::iterator 应该可以工作,除非您没有向我们展示的代码的某些部分导致了 quote const 在这种情况下您可以使用 string::const_iterator

【讨论】:

    【解决方案2】:

    根据SGI documentation,您使用的search 的形式具有签名:

    template <class ForwardIterator1, class ForwardIterator2>
    ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                            ForwardIterator2 first2, ForwardIterator2 last2);
    

    由于您的FowardIterator1 类型是std::string::iterator,因此您的返回类型也必须是std::string::iterator

    【讨论】:

      【解决方案3】:

      不关心返回类型怎么样? :)

      bool in_quote(const string& s){
          return search(quote.begin(), quote.end(), s.begin(), s.end()) != quote.end();
      }
      

      【讨论】:

      • 很好的务实答案,但问题更多是关于为什么权威参考书中的代码示例不起作用。
      • 这个错误很可能在以后的版本中得到了纠正。我没有这本书,但谷歌有它:books.google.com/…
      • @Mark:它似乎来自链接 :)
      【解决方案4】:

      我尝试了以下

      bool in_quote(const string& s){
        string::iterator p = search(quote.begin(), quote.end(), s.begin(), s.end());
        return p != quote.end();
      } 
      

      它确实编译没有错误...

      【讨论】:

      • 我刚刚发现我在复制代码时纠正了一个错字。 string::iterator 应该可以工作。谢谢。
      【解决方案5】:

      你有一个const string,所以它必须是const_iterator

      string::const_iterator p = search(quote.begin(), quote.end(), s.begin(), s.end());
      

      【讨论】:

      • 我不这么认为:search 的返回类型与前两个参数相同(毕竟它是 quote 的迭代器)。而quote 不是 const ...
      • 实际规则是什么?搜索字符串是const,但正在搜索的字符串不是。
      • @MartinStettner:看来你是对的。但我有充分的理由假设所给出的代码不是不起作用的确切代码。
      • @MarkRansom 你得到一个迭代器到被搜索的字符串中(位置,找到搜索字符串的位置......)。由于正在搜索的字符串是非常量的,因此返回值也是非常量的迭代器...
      • @MartinStettner,这完全有道理,并且在我查阅后同意 Microsoft 文档。在我发布我的评论之前我没有看到你的评论,我的评论是针对 ybungalobill 的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多