函数返回向量的迭代器

时间:2009-04-08 08:02:02

标签: c++ vector iterator

我有这个继承vector的新类Seq并具有一些额外的功能。我可以使用Seq。

的所有矢量方法

拥有此数据结构:

Seq< vector<int> > sweepEvents;

我希望有一个函数在sweepEvents中对它进行元素向量边搜索,并将迭代器返回到sweepEvents中找到的元素的位置(当且仅当edge }找到了)和向量的最后一个元素的迭代器(当且仅当找不到edge时)。

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

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

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;
}

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

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());
}

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

4 个答案:

答案 0 :(得分:2)

Seq&lt;矢量&lt; T> &gt; :: iterator在Seq类中定义?

制作模板'vector'的参数并不意味着存在类型Seq&lt;矢量&lt; int&gt; &GT; ::迭代

答案 1 :(得分:1)

编译错误是什么?如何定义Seq<X>::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);
}

这很好用。

答案 2 :(得分:0)

代码中不合逻辑的东西。看我的评论:

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

答案 3 :(得分:0)

一点注意事项:

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

另一个小小的说明:

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

第三个小记:

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