【问题标题】:Function returning an iterator of vector返回向量迭代器的函数
【发布时间】:2009-04-08 08:02:01
【问题描述】:

我有一个继承向量并具有一些附加功能的新类 Seq。我可以将向量的所有方法与 Seq 一起使用。

拥有这个数据结构:

Seq< vector<int> > sweepEvents;

我想要一个函数,它在sweepEvents 中进行元素向量边缘搜索,并将迭代器返回到sweepEvents 中找到的元素的位置(当且仅当找到edge)和指向向量最后一个元素的迭代器(当且仅当未找到 edge 时)。

然后我想使用这个迭代器,因为我想比较迭代器上一个位置和下一个位置的元素。

我有以下函数用于创建和返回迭代器:

Seq< vector<int> >::iterator QSweep::insertSweepEvents(edge_t edge,int currentDim){
    int changePosition;
    int found=0;

    for (int i=0;i<currentDim;i++){
         if (edge[0]==sweepEvents[i][1]){
             changePosition=i;
             found=1;
             return sweepEvents.begin()+changePosition;
         }
    }
    if (found==1){
        sweepEvents.rep().insert(sweepEvents.begin()+changePosition,edge);
        sweepEvents.rep().erase(sweepEvents.begin()+changePosition+1);
    }   
    else{
        sweepEvents.rep().insert(sweepEvents.end(),edge);
    }

    return sweepEvents.end()-1;
}

然后我在主函数中调用这个迭代器。我实际上尝试过,但它没有编译,我不知道除此之外要使用什么语法:

int main(){
    Seq< vector<int> > sweepEvents;
    vector<int> edge;
    //.....initialize sweepEvents and edge

    //declare iterator but not working
     Seq< vector<int> >::iterator comparePosition; 

   //not working neither
    comparePosition=insertSweepEvents(edge,sweepEvents.size());
}

关于我应该如何正确调用迭代器的任何想法?我发现它不能作为数组中的整数索引?

【问题讨论】:

  • 你的意思是“不工作”?结果不好,编译器错误,核心?
  • comparePosition 的定义和之后的 comparePosition 赋值的编译器错误。
  • 你的 if (found==1) 块永远不会被执行,因为当你设置 found = 1 时你会返回。你在哪个编译器中会遇到什么编译器错误?

标签: c++ vector iterator


【解决方案1】:

你的 Seq 类中是否定义了 Seq>::iterator?

使模板'vector'的参数并不意味着存在类型Seq>::iterator

【讨论】:

    【解决方案2】:

    什么编译错误? Seq&lt;X&gt;::iterator是怎么定义的?

    #include <vector>
    
    template<typename T>
    struct Seq
      : public std::vector<T>
    { };
    
    typedef Seq< std::vector<int> > SeqI;
    
    SeqI::iterator insertSweepEvents(SeqI &s)
    {
      return s.begin();
    }
    
    int main()
    {
      SeqI s;
      SeqI::iterator e = insertSweepEvents(s);
    }
    

    这很好用。

    【讨论】:

    • 所以 SeqI 是我的数据类型,所以作为我函数的参数,我还需要我的 sweepEvents 列表的地址吗?
    • 否,但您需要处理一个引用,以便您返回的迭代器有效。
    • 我与我看到的向量非常平行。所以现在我有了 e (到正确位置的迭代器),我怎样才能从 s 打印位置 e 的元素?或者只是位置?
    • 你可以使用 std::distance(v.begin(), it) 来获取两个迭代器之间的距离(
    【解决方案3】:

    您的代码中有一些不合逻辑的地方。看我的cmets:

    int found = 0;
    for (int i=0;i<currentDim;i++){
         if (edge[0]==sweepEvents[i][1]){
                     changePosition=i;
                     found=1; 
    // This place is one, where we assign 1 to found, and we do return after that (maybe you want do break/?)
                     return sweepEvents.begin()+changePosition;
             }
    }
    if (found==1){ // as you see we reach this place only when found == 0
    

    【讨论】:

    • 所以我对创建我想要的东西没有任何问题。我认为该元素不在列表中!然后我将新元素与所有元素进行比较,如果我找到了一个相同的元素,我说我找到了它并返回位置。然后如果发现我插入了正确的位置,如果不是在我的向量的末尾。
    • 也许这不是主要问题,但无论如何你可以删除这个 if block 并只留下其他。您也可以删除找到的变量。
    • 如果我删除找到然后找到的元素被添加到所需的位置,然后也添加到最后一个位置,就像我尝试过的那样。
    • 不,如果找到元素,则返回。当我们到达 if ( found ) - found 将有 0 值,并且 if 块将被跳过。
    【解决方案4】:

    一点旁注:

    vector 更改后,尤其是在追加或插入时,它的迭代器变得无效。这是因为vector 试图为其内部数据分配一个最小大小的连续内存块,同时它试图最小化它需要分配一个新的、更大的块的次数。因此数据可能会在内存中移动,因此 before push 的迭代器在它之后 不再有效。

    另一个小提示:

    您可以使用std::difference( it1, it2 ) 找到两个迭代器之间的区别。您可以使用 std::advance( it1, d ) 重新应用该差异。

    第三个小笔记:

    你似乎在 for 循环中有一个'return' 语句,但其余代码使用仅在返回时设置的变量...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多