简体   繁体   English

为什么std :: search需要转发iters

[英]why does std::search need forward iters

my issue is identical to the thread below, I'm struggling to understand the answers given, or rather my code shouldn't work as it only uses input iterators ..but my func appears to work and behave identically to std::search ..so I'm at a loss and loathe to move on without understanding properly ...maybe if someone can suggest an input that will break my function but not the std:: 我的问题与下面的线程相同,我很难理解给出的答案,或者说我的代码不应该工作,因为它只使用输入迭代器..但我的func似乎工作和行为与std :: search相同。 。所以我很茫然,不愿意继续前进而不理解......也许如果有人可以提出一个会破坏我的功能而不是std的输入::

From Why do I need a Forward Iterator to implement my customized std::search : 我为什么需要Forward Iterator来实现我自定义的std :: search

I am studying the book "Accelerated C++" from Koenig & Moo. 我正在研究Koenig&Moo的“Accelerated C ++”一书。

Exercise 8-2 ask me to implement on my own some templatized functions from <algorithm> and <numeric>, and to specify what kind of iterator does my implementation require. 练习8-2让我自己实现一些来自<algorithm>和<numeric>的模板化函数,并指定我的实现需要什么样的迭代器。

When trying to implement std::search, I determined that I need only "input" iterators. 在尝试实现std :: search时,我确定我只需要“输入”迭代器。

However, looking at the implementation of std::search installed with my compiler, I can see that they use "forward" iterators, but I cannot understand why, because there is no need to write, only to read, and input iterators meet the requirement. 但是,看看用我的编译器安装的std :: search的实现,我可以看到它们使用“前向”迭代器,但是我无法理解为什么,因为没有必要编写,只能读取,输入迭代器符合需求。

Can anybody here help me to understand this, please? 请问有人帮我理解这个吗? Why would I need to use "forward" iterators to implement std::search? 为什么我需要使用“前向”迭代器来实现std :: search?

Thanks in advance. 提前致谢。

myfunction: 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: 司机:

///* // 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 ;

}

You've misunderstood what an input iterator can do. 你误解了输入迭代器可以做什么。

You can't "save" or copy an input iterator. 您不能“保存”或复制输入迭代器。 It allows you to traverse the sequence exactly once. 它允许您只扫描序列一次。 In other words, this line, among others, will break: begin2 = pattern_begin . 换句话说,这一行将会破坏: begin2 = pattern_begin

An input iterator may represents something that you can't readily "rewind", like, say, the stream of data received from a network adapter. 输入迭代器可能代表您无法“快退”的内容,例如,从网络适配器接收的数据流。 An iterator pointing to "6 elements ago" is no longer meaningful, because that data may no longer be available in memory. 指向“6个元素之前”的迭代器不再有意义,因为该数据可能在内存中不再可用。 You only have the current position in the stream. 您只有流中的当前位置。

It should be obvious that in order to implement search correctly, you need to be able to traverse parts of the sequence more than once. 显而易见的是,为了正确实现search ,您需要能够多次遍历序列的某些部分。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM