Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::search()的返回类型_C++_Search_Stl - Fatal编程技术网

C++ std::search()的返回类型

C++ std::search()的返回类型,c++,search,stl,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 tes

我试图测试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 *'
错误C2440:“正在初始化”:无法从转换
'std::_String_iterator'到'char*'

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

您有一个
常量字符串
,因此它必须是
常量迭代器

string::const_iterator p = search(quote.begin(), quote.end(), s.begin(), s.end());
我尝试了以下方法

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

而且它编译时没有出错…

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

根据,您正在使用的
搜索
表单具有以下签名:

template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2);
模板
ForwardIterator1搜索(ForwardIterator1 first1,ForwardIterator1 last1,
ForwardIterator2 first2,ForwardIterator2 last2);

由于您的
foward迭代器1
类型是
std::string::iterator
,因此返回类型也必须是
std::string::iterator

早期实现的
string
可以轻松地使用
char*
作为迭代器类型,允许正确编译此错误的代码段。大多数
string::iterator
的现代实现都有适当的类类型,并且不能转换为
char*

签字人:

模板
ForwardIterator1搜索(ForwardIterator1 first1,ForwardIterator1 last1,
ForwardIterator2 first2,ForwardIterator2 last2);

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

如果您有C++11,请使用
auto
。但它看起来应该是
std::string::iterator
。当你尝试那一个时,有什么信息?它应该是另一条消息。@ubbdd迭代器不是指针。顺便打开“输出”窗口查看完整消息。它应该告诉您
\u Elem
的类型,我不这么认为:
search
的返回类型与前两个参数相同(毕竟它是
quote
的一个itereator)。而
quote
不是常量…实际规则是什么?搜索字符串是
const
,但被搜索的字符串不是。@MartinStettner:看来你是对的。但是我有很好的理由假设所给出的代码不是不起作用的代码。@markransem您可以在正在搜索的字符串中找到一个迭代器(找到搜索字符串的位置…)。由于正在搜索的字符串是非常量的,因此返回值也是非常量迭代器…@MartinStettner,这完全有道理,并且在我查找它后与Microsoft文档一致。在我发布我的评论之前,我没有看到你的评论,我的评论是针对ybungalobill的。我只是发现我在复制代码时更正了一个拼写错误。迭代器应该可以工作。谢谢。很好的实用答案,但问题更多的是为什么权威参考书中的代码示例不起作用。很有可能在以后的版本中更正了错误。我没有这本书,但谷歌有:@Mark:它似乎来自链接:)
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2);
template <class ForwardIterator1, class ForwardIterator2>
   ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
                             ForwardIterator2 first2, ForwardIterator2 last2 );