std::search()的返回类型

return type for std::search()

本文关键字:返回类型 search std      更新时间:2023-10-16

我正在尝试测试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,并得到了同样的错误。那么,正确的类型应该是什么,它应该是容器的迭代器类型吗?由于

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

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

我尝试了以下方法

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

你有一个const string,所以它一定是const_iterator:

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

string的早期实现可以很容易地使用char*作为它们的迭代器类型,从而允许正确编译这个不正确的代码片段。string::iterator的大多数现代实现都有适当的类类型,不能转换为char*

std::search的签名为

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

可以看到,返回类型与传递给函数的前两个迭代器的类型相同。在你的情况下,string::iterator应该工作,除非有一部分代码你没有显示给我们,使quote const,在这种情况下,你可以使用string::const_iterator

根据SGI文档,您使用的search格式有签名:

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

既然您的FowardIterator1类型是std::string::iterator,那么您的返回类型也必须是std::string::iterator