【问题标题】:C++ - manipulating objects in a STL vector?C++ - 在 STL 向量中操作对象?
【发布时间】:2011-11-10 11:05:16
【问题描述】:

我有这样的结构:

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;

这不起作用。是因为nodes[i]返回了对象的副本吗?

有没有使用指针的解决方案?

我不能使用指针 (Rz3DContourNode*) ,因为我在 OpenGL 中使用这个向量作为

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

编辑 - 对不起。我实际上保留了一个 QList 并每次都获取 std::vector。这就是原因

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

【问题讨论】:

  • nodes[i] 不返回对象的副本,您可以发布一些失败的代码吗? *(&amp;nodes[i].nx)=newNXValue; 可以/应该简化为 nodes[i].nx = newNXValue;
  • 谢谢,我每次都得到向量的副本。这就是原因。

标签: c++ memory pointers stl vector


【解决方案1】:

为什么要使用指针? [] 操作符返回对存储对象的引用,所以你可以这样做

nodes[i].nx = newNXValue;
nodes[i].ny = newNYValue;
nodes[i].nz = newNZValue;

【讨论】:

    【解决方案2】:

    它适用于我的编译器.... 获取实例的地址然后取消引用它与不执行所有操作相同。 所以你不需要它。所以替换这个

    *(&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;
    }
    

    【讨论】:

    • 对不起,我做错了什么。我每次都得到一个向量的副本。(来自 QList)
    • 有时候,当你整天都在做这件事时,除非你向别人寻求帮助,否则你无法看透自己的问题。然后,当您将问题口头表达给其他人时,答案突然变得清晰。如果您喜欢这个答案,请投票。
    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多