C ++ - манипулирование объектами в векторе STL? - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть такая структура:

struct Rz3DContourNode {
  float x;
  float y;
  float z;
  float nx;
  float ny;
  float nz;
};

И я сохраняю элементы в векторе STL следующим образом:

 std::vector < Rz3DContourNode >  nodes;

Теперь я хочу изменить nx, ny-компонентузлов в векторе. Я попытался следующим образом:

*(&nodes[i].nx)=newNXValue;
*(&nodes[i].ny)=newNYValue;
*(&nodes[i].nz)=newNZValue;

Это не сработало. Это потому, что node [i] возвращает копию объекта?

Есть ли какое-то решение для этогоожидаете использовать указатели?

Я не могу использовать указатель (Rz3DContourNode *), потому что я использую этот вектор в OpenGL как

glNormalPointer(GL_FLOAT,sizeof(Rz3DContourNode), &nodes[0].nx);

РЕДАКТИРОВАТЬ - я извиняюсь. Я на самом деле держуQList и получайте std :: vector каждый раз. Это было причиной

std::vector<Rz3DContourNode> nodeVector = nodes.toVector().toStdVector();

Ответы [ 2 ]

11 голосов
/ 05 сентября 2011

Зачем возиться с указателями?Оператор [] возвращает ссылки на сохраненные объекты, поэтому вы можете просто сделать

nodes[i].nx = newNXValue;
nodes[i].ny = newNYValue;
nodes[i].nz = newNZValue;
2 голосов
/ 05 сентября 2011

Это работает на моем компиляторе .... Взять адрес экземпляра и затем разыменовать его так же, как и не делать все это.Так что тебе это не нужно.Поэтому замените это

*(&nodes[i].nx)=newNXValue;

на

nodes[i].nx = newNXValue;

Вот пример кода, который я пробовал:

#include "stdafx.h"
#include <stdio.h>
#include <vector>

struct Rz3DContourNode {
  float x;
  float y;
  float z;
  float nx;
  float ny;
  float nz;
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector < Rz3DContourNode >  nodes;
    float newNXValue = 4545.4f;
    float newNYValue = 453.0f;
    float newNZValue = 34.0f;

    for (int i = 0; i < 3; i++)
    {
        Rz3DContourNode node = {1.0f,1.0f,1.0f,1.0f,1.0f,1.0f};
        nodes.push_back(node);
    }

    for (int i = 0; i < nodes.size(); i++)
    {
        nodes[i].nx = newNXValue;
        nodes[i].ny = newNYValue;
        nodes[i].nz = newNZValue;
    }

    return 0;
}
...