std :: search()的返回类型

时间:2011-11-04 19:33:54

标签: c++ search stl

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

5 个答案:

答案 0 :(得分:4)

如何不关心返回类型? :)

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

答案 1 :(得分:3)

我尝试了以下

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

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

答案 2 :(得分:1)

您有const string,因此必须是const_iterator

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

答案 3 :(得分:1)

string的早期实现很容易使用char*作为迭代器类型,允许这个不正确的代码段正确编译。 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。< / p>

答案 4 :(得分:0)

根据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