我的问题与下面的主题相同,我很难理解给出的答案,或者说我的代码不应该工作,因为它只使用输入迭代器..但我的func似乎工作和行为与std相同: :搜索..所以我很茫然,不愿意继续前进而不理解......也许如果有人可以提出一个会破坏我的功能而不是std ::
的输入来自Why do I need a Forward Iterator to implement my customized std::search:
我正在研究这本书“加速 C ++“来自Koenig& Moo。
练习8-2请求我实施 拥有一些模板化的功能 <算法>和< numeric>,以及 指定我的迭代器类型 实施要求。
尝试实现std :: search时 我确定我只需要“输入” 迭代器。
但是,看看实施情况 用我的安装std :: search 编译器,我可以看到他们使用 “前进”迭代器,但我不能 明白为什么,因为没有 需要写,只需要阅读和输入 迭代器符合要求。
这里的任何人都可以帮助我理解 这个,拜托?我为什么需要使用 “转发”迭代器来实现 的std ::搜索?
提前致谢。
myfunction的:
template <class In>
In search( In begin, In end, In begin2, In end2 )
{
In found ; // iter: 1st element in pattern match(in content)
In pattern_begin = begin2 ; // iter: 1st element in search pattern.
int flag = 0 ; // flag: partial match found?
// search content for pattern
while ( begin < end ) {
// if pattern-match fails ..reset vars
// & continue searching remaining content/elements
if ( *begin != *begin2 ) {
In ret ;
begin2 = pattern_begin ;
flag = 0 ;
begin++ ;
} else {
// compare next element in pattern with next element in content.
// if: 1st element of 'pattern' is found, store iter to it's pos
// ..then if entire pattern is found, we can ret an iter to where it starts
if ( flag == 0 ) {
found = begin ;
flag = 1 ;
}
// inc iters to compare next elements in partial match
begin++ ;
begin2++ ;
}
// if: iter is 1-past end of search pattern
// then entire pattern has been found
// return the iter to where it starts
if( begin2 == end2 ) { return found ; }
}
// end of content reached, no complete pattern found
// begin should? equal an iter 1-past the end of content
return begin ;
}
驱动器:
///* // Driver: custom::search( b, e, b2, e2 )
#include <string>
#include <vector>
#include <iostream>
//#include <algorithm>
#include "library_algorithms.h"
int main() {
// init string test
std::string content = "fo The fox foxu jumped foxe foxy " ;
std::string search_pattern = "foxy" ;
// func test on string
std::string::iterator ret_iter =
custom::search( content.begin(), content.end(), search_pattern.begin(), search_pattern.end() ) ;
//std::search( content.begin(), content.end(), search_pattern.begin(), search_pattern.end() ) ;
// output
if ( ret_iter != content.end() ) {
std::cout << std::endl << std::endl << search_pattern << ": found at position: " << int( ret_iter - content.begin() ) << std::endl;
} else {
std::cout << std::endl << std::endl << search_pattern << ": ...not found" << std::endl;
}
// Init vec test:
// create content values in range: 10 20 30 <......> 9970 9980 9990
std::vector<int> myvector;
for (int i=1; i<1000; i++) myvector.push_back(i*10);
// create pattern values to search for
std::vector<int> pattern ;
pattern.push_back( 3730 ) ;
pattern.push_back( 3740 ) ;
pattern.push_back( 3750 ) ;
pattern.push_back( 3760 ) ;
// test: func on vector<int>
std::vector<int>::iterator it;
it = custom::search ( myvector.begin(), myvector.end(), pattern.begin(), pattern.end() );
// output
if (it!=myvector.end())
std::cout << std::endl << std::endl << "pattern found at position " << int(it-myvector.begin()) << std::endl;
else
std::cout << std::endl << std::endl << "pattern not found" << std::endl;
return 0 ;
}
答案 0 :(得分:11)
你误解了输入迭代器可以做什么。
您无法“保存”或复制输入迭代器。它允许您只扫描序列一次。换句话说,这一行将会破坏:begin2 = pattern_begin
。
输入迭代器可能代表您无法“快退”的内容,例如,从网络适配器接收的数据流。指向“6个元素之前”的迭代器不再有意义,因为该数据可能在内存中不再可用。您只有流中的当前位置。
显而易见,为了正确实现search
,您需要能够多次遍历序列的某些部分。