Функция, возвращающая итератор вектора - PullRequest
2 голосов
/ 08 апреля 2009

У меня есть новый класс 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;
}

Затем я вызываю этот итератор в главной функции. Я на самом деле пытался, но он не компилируется, и я не знаю, какой синтаксис использовать, кроме этого:

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 ]

2 голосов
/ 08 апреля 2009

Определен ли Seq > :: iterator в вашем классе Seq?

Создание параметра шаблона 'vector' не означает, что существует тип Seq > :: iterator

1 голос
/ 08 апреля 2009

Какая ошибка компиляции? Как определяется 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);
}

Это отлично работает.

0 голосов
/ 08 апреля 2009

Небольшой знак:

После изменения vector, особенно при добавлении или вставке, итераторы к нему становятся недействительными. Это связано с тем, что vector пытается выделить непрерывный блок памяти минимального размера для своих внутренних данных, и в то же время пытается минимизировать количество раз, которое необходимо для выделения нового, большего фрагмента. Таким образом, данные могут перемещаться по памяти, поэтому итераторы к нему до a push больше не действительны после этого.

Еще одна небольшая заметка:

Вы можете найти разницу между двумя итераторами, используя std::difference( it1, it2 ). Вы можете повторно применить эту разницу, используя std::advance( it1, d ).

Третья небольшая заметка:

Кажется, у вас есть оператор return внутри цикла for, но в остальной части кода используются переменные, которые устанавливаются только при возврате ...

0 голосов
/ 08 апреля 2009

Что-то нелогичное в вашем коде. Смотрите мои комментарии:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...