Итерация по всем элементам вектора - PullRequest
4 голосов
/ 04 августа 2011

У меня есть два struct, определенные следующим образом:

struct vertex
{
  double x;
  double y;
  double z;
};

struct finalVertex
{
  int n;
  vertex v;
};

Я использую следующий код для перебора списка и печати всех членов:

  vector<finalVertex> finalVertices;
  vector<finalVertex>::iterator ve;

  for ( ve = finalVertices.begin(); ve < finalVertices.end(); ve++ )
    {
      out << *(ve).v.x << *(ve).v.y << *(ve).v.z << endl;
    }

Я получаю следующий код ошибки:

main.cpp: 651: ошибка: 'class __gnu_cxx :: __ normal_iterator>>' не имеет члена с именем 'v'

Каков синтаксически правильный способ доступа к элементам набора?

Ответы [ 6 ]

8 голосов
/ 04 августа 2011

Проблема заключается в приоритете оператора: напишите (*ve).v.x или проще, ve->v.x.

Кроме того, я бы посоветовал вам переопределить operator << для вашей vertex структуры, чтобы сделать ваш код намного более читабельным:

std::ostream& operator <<(std::ostream& out, vertex const& value) {
    return out << value.x << " " << value.y << " " << value.z;
}

, а затем используйте его так:

for ( ve = finalVertices.begin(); ve != finalVertices.end(); ve++ )
    out << ve->v << endl;
3 голосов
/ 04 августа 2011

Что вы должны сделать, это:

ve->v.x

Что вы также можете сделать:

(*ve).v.x

но это отстой. :)

2 голосов
/ 04 августа 2011
        for ( ve = finalVertices.begin(); ve != finalVertices.end(); ++ve )
        {
            ve->v.x;
        }
2 голосов
/ 04 августа 2011

Переместите разыменование внутрь паренсов, вот так:

out << (*ve).v.x << (*ve).v.y << (*ve).v.z << endl;

Я бы также предложил изменить ve < finalVertices.end(); на ve != finalVertices.end();.

2 голосов
/ 04 августа 2011
out << *(ve).v.x << *(ve).v.y << *(ve).v.z << endl;

Ваш *(ve).v.x эквивалентен *((ve).v.x). Вы, вероятно, хотите:

out << (*ve).v.x << (*ve).v.y << (*ve).v.z << endl;

Или:

out << ve->v.x << ve->v.y << ve->v.z << endl;

Кроме того, ваш цикл не так эффективен, как мог бы быть. Вызов end() для каждой итерации не требуется, и постинкремент может быть намного тяжелее с итераторами, чем обычные указатели / целые числа, поэтому вы должны привыкнуть использовать преинкремент, когда это возможно:

for ( ve = finalVertices.begin(), end = finalVertices.end(); ve != end; ++ve )
1 голос
/ 04 августа 2011

Вы не должны писать ve ты должен написать ve! = FinalVertices.end ()

...