访问C ++结构的各个元素

时间:2012-12-17 02:56:04

标签: c++ struct

这是我遇到的问题,如果我解释不好或代码质量不好,请不要打扰我 - 到目前为止我只做了大约2周的C ++。

解释:我想构建一个结构(一个结构可能不是最好的决定,但我必须从某处开始),它将包含一组点的坐标(仅限x和y) (让我们将集合称为弧),设置id(以及可能的其他字段)。每组(弧)可包含不同数量的点。 我已经将集合(弧)中的每个点都实现为类,然后我的弧结构在向量中包含此类的各种实例(以及其他内容)。

弧形结构示例:

Struc1:

Id(int)1

xY(向量)(0; 0)(1; 1)(2; 2)

Struc2:

Id(int)2

xY(载体)(1; 1)(4; 4)

问题: 我无法弄清楚如何访问我的arc结构中的元素:例如,如果我需要使用Id 1访问struc中第二个点的坐标,我会想要Struc1.xY[1],但是这不起作用正如我的代码(下面)所示。 我发现this post解释了如何在结构中打印值,但我需要访问这些元素(稍后)有条件地编辑这些坐标。这怎么能被强制实施?

我的尝试:(已编辑)

#include <cmath>
#include <vector>
#include <cstdlib> 
#include <stdio.h>
#include <iostream>

using namespace std;

class Point
  {
  public:
      Point();
      ~Point(){ }

      void setX (int pointX) {x = pointX; }
      void setY (int pointY) {y = pointY; }
      int getX() { return x; }
      int getY() { return y; }

  private:
      int x;
      int y;
  }; 

Point::Point()
    {
        x = 0;
    y = 0;
    }

struct arc {
  int id;
  vector<Point> xY;
};

int main(){

  arc arcStruc;
  vector<Point> pointClassVector;
  int Id;
  int X;
  int Y;
  // other fields go here

  arc *a;

  int m = 2; // Just create two arcs for now
  int k = 3; // each with three points in it
  for (int n=0; n<m; n++){    
    a = new arc;
    Id = n+1;
    arcStruc.id = Id;
    Point pt;
    for (int j=0; j<k; j++){            
      X = n-1;
      Y = n+1;      
      pt.setX(X);
      pt.setY(Y);
      arcStruc.xY.push_back(pt);

    }
  }

for (vector<Point>::iterator it = arcStruc.xY.begin(); it != arcStruc.xY.end(); ++it)
  {
    cout << arcStruc.id.at(it);
    cout << arcStruc.xY.at(it);
  }

  delete a;  
  return 0;
}

1 个答案:

答案 0 :(得分:1)

一些建议:

  • 不要打扰单独的pointClassVector,只需使用arcStruc.xY.push_back()创建Point对象直接进入arcStruc.xY。行arcStruc.xY = pointClassVector触发整个向量的副本,这有点浪费CPU周期。
  • 绝对没有必要尝试在堆上创建Point对象,所有这一切都会增加复杂性。只需使用Point pt;并调用它上面的set函数 - 虽然我个人会完全取消set函数并直接操作Point中的数据,但是不需要getter / setter并且它们不会给你买任何东西。如果这是我的代码,我会编写点构造函数,将x和y作为参数,这可以为您节省大量不必要的代码。您也不需要为析构函数提供实现,编译生成的一个很好。

如果要遍历向量,则应该使用迭代器而不是尝试索引到容器中。无论哪种方式,您都可以访问arcStruc.xY来获取其大小,然后使用[]运算符或使用迭代器单独访问元素,如下所示:

 for (vector<Point>::iterator it = arcStruc.xY.begin(); it != arcStruc.xY.end(), ++it)
 {
    ... do something with it here, it can be derefernced to get at the Point structure ...
 }