首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第2部分:为什么我需要一个前向迭代器来实现定制的std::search

第2部分:为什么我需要一个前向迭代器来实现定制的std::search
EN

Stack Overflow用户
提问于 2011-03-23 22:14:39
回答 1查看 134关注 0票数 0

不要认为读第一部分是有必要的,但我只是附带了一个链接:why does std::search need forward iters

有迭代器的.....almost (我想) ..I环顾四周寻找一个简单的全1表,它显示了各种类型迭代器的可用功能.找不到一个,所以我尝试扩展stroustrup的表,包括这样的内容:传递范围的能力不止一次,etc...let me知道我是否遗漏或误解了什么?..or,如果有一个更好的表在踢。

必须在增量之间引用*1++ (De)

不需要引用*n++,可以多次递增

*n_save范围可以多次传递,也可以保存/复制。

代码语言:javascript
复制
------------------------------------------------------------------------------
-  Iterator Operations and Categories                                     
------------------------------------------------------------------------------
Category:        output  input    forward    bidirectional   random-access
Abbreviation:    Out     In       For        Bi              Ran 
------------------------------------------------------------------------------
Read(*1++):              =*p            
Read(*n++):                       =*p        =*p             =*p
Read(*n_save):                    =*p        =*p             =*p

Write(*1++):     *p=             
Write(*n++):                      *p=        *p=             *p=
Write(*n_save):                   *p=        *p=             *p=

Access:                   ->      ->         ->              ->[]

Iteration:        ++      ++      ++         ++--            ++ -- + - += -=
Comparison:               == !=   == !=      == !=           == != < > >= <= 
------------------------------------------------------------------------------

Write(*n_save) .不确定复制/保存一个iter是读的还是写的,我把它加到了两个?..Im猜测如果您可以读-传递一个范围超过once..you可能也想写-传递一个范围不止一次?

我现在明白了为什么std::搜索需要前向迭代器,但不确定为什么它需要4个..would 2来满足&2?

代码语言:javascript
复制
while (  begin != end  ) {     
if( begin2 == end2 ) {  return found ;  }
}

..is,因为endend2不止一次引用(每次the循环)..?

代码语言:javascript
复制
template <class For, class In> 
For search(  For begin, In end, For begin2, In end2 )
{
    For found ;                     
    For pattern_begin = begin2 ;    //refd
    int flag = 0 ;                  

    // search content for pattern 
    while (  begin != end  ) {      //refd

        if ( *begin != *begin2 ) {    //de-refd

            begin2 = pattern_begin ;  //store/copy
            flag = 0 ;
            begin++ ;             //inc


        } else {

            if ( flag == 0 ) { 

                found = begin ;
                flag = 1 ;
            }

            begin++ ;
            begin2++ ;
        }

        if( begin2 == end2 ) {  return found ;  } //refd

    }

    return begin ;
}
EN

回答 1

Stack Overflow用户

发布于 2011-03-23 22:24:36

我想你已经从稀薄的空气中拉出了“必须在解除引用之间增加”。

输入和输出操作符实现了这些,这样它们就可以被一个并不特别期望它们的函数使用,但是本质上增量很可能是对它们的不操作。

该搜索函数需要四个迭代器,因为否则根本无法判断这两个范围的结束位置。迭代器本身并不(必然)知道它是否位于范围的末尾。

SC++L中的范围由相同类型的一对迭代器表示。从技术上讲,这些算法可以在单个范围内接受不同类型的迭代器,但这几乎没有任何实际用途,只会使代码更容易出错。实际上,至少可以在编译时检测到一种错误:

代码语言:javascript
复制
void foo(container& a, const container& b, const container& c) {
    std::search(a.begin(), b.end(), c.begin(), c.end());
}

这里的错误是将迭代器传递到前两个参数的不同容器中。但在本例中,这将在编译时捕获,因为幸运的是,ab恰好具有不同的一致性,因此a.begin()返回container::iteratorb.end()返回不同类型的container::const_iterator。如果允许所有四个参数都是不同类型的,则此错误将导致运行时的未定义行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5412308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档