C ++ vector <T>:: оператор итератора + - PullRequest
0 голосов
/ 13 апреля 2010

Я держу итератор, который указывает на элемент вектора, и я хотел бы сравнить его со следующим элементом вектора.

Вот что у меня есть

Class Point{
public:
 float x,y;
}

//Somewhere in my code I do this

vector<Point> points = line.getPoints();

foo (points.begin(),points.end());

где foo:

void foo (Vector<Point>::iterator begin,Vector<Point>::iterator end)
{
    std::Vector<Point>::iterator current = begin;

    for(;current!=end-1;++current)
    {
        std::Vector<Point>::iterator next = current + 1;

        //Compare between current and next.
    }
}

Я думал, что это сработает, но current + 1 не дает мне следующий элемент вектора.

Я, хотя оператор + был путь, но не кажется так. Есть ли решение этой проблемы?

* 1014 БЛАГОДАРЯ *

Ответы [ 3 ]

3 голосов
/ 13 апреля 2010

current + 1 действителен для итераторов с произвольным доступом (которые включают в себя векторные итераторы) и является итератором после текущего (т. Е. Того, что вы думаете, он делает). Проверьте (или опубликуйте!) Свой код сравнения, там вы, вероятно, делаете что-то не так.

1 голос
/ 13 апреля 2010

std::vector имеет итераторы с произвольным доступом . Это означает, что они, в основном, так же универсальны, как указатели. Они обеспечивают полноценную арифметику указателей (it+5, it+=2) и сравнения, отличные от != / == (то есть <, <=, > и >=).

Сравнение между итераторами в вашем коде, безусловно, должно работать, но будет бессмысленным:

for(std::vector<Point>::iterator current = begin;current!=end-1;++current)
{
    std::vector<Point>::iterator next = current + 1;

    assert(current!=next); // always true
    assert(current<next); // also always true
}

Так что, если это не сработает для вас, скорее всего, вы делаете что-то не так. К сожалению, «... не дает мне следующий элемент вектора ...» не дает нам никакой подсказки о том, что вы пытаетесь, поэтому трудно догадаться, что вы делаете неправильно.

0 голосов
/ 13 апреля 2010

Возможно, это просто опечатка, но ваш код ссылается на Vector, тогда как стандартный контейнер vector (строчная буква V).

Но если это не опечатка в вашем вопросе, не видя определения Vector, нет никакого способа сказать, что это делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...