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

问题描述 投票:0回答:2

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

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

圆弧结构示例:

结构1:

Id(整数)1

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

Struc2:

Id(整数)2

xY(矢量) (1;1) (4;4)

问题: 我不知道如何访问我的弧结构中的元素:例如,如果我需要访问 Id 1 的结构中第二个点的坐标,我会想要

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;
}
c++ struct
2个回答
1
投票

一些建议:

  • 不必理会单独的
    pointClassVector
    ,只需使用
    arcStruc.xY.push_back()
    创建 Point 对象并将其直接放入 arcStruc.xY 中即可。
    arcStruc.xY = pointClassVector
    行触发了整个向量的副本,这有点浪费 CPU 周期。
  • 绝对没有必要尝试在堆上创建
    Point
    对象,这样做只会增加复杂性。只需使用
    Point pt;
    并调用其上的设置函数 - 尽管我个人会完全取消设置函数并直接操作 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 ...
 }

0
投票
#include <vector>
#include <cstdlib> 
#include <iostream>

using namespace std;


class point{
    public:
        int x,y;
        void setx(int xx){
            x=xx;
        }
        void sety(int yy){
            y=yy;
        }
        int getx(){
            return x;
        }
        int gety(){
            return y;
        }
};


struct arc{
    int id;
    std::vector<point> pt_l;
};

int main(){
    std::vector<arc*> arc_list;
    arc *a;
    for (int i=0;i<2;i++){
        a = new arc;
        arc_list.push_back(a);
        a->id = i;
        point pt;
        for(int j = 0 ; j < 3 ; j++){
            //pt = new point;
            pt.setx(j+1);
            pt.sety(j-1);
            a->pt_l.push_back(pt);
        }
    }
    
    for(int i=0; i < int(arc_list.size()) ; i++)
    {
        cout << arc_list[i]->id << "\n" ;
        for(int j = 0 ; j < int(arc_list[i]->pt_l.size()) ; j++){
            cout << arc_list[i]->pt_l[j].getx() << " " << arc_list[i]->pt_l[j].gety() << endl;
        }
    }
    
    
}```

You could of used `std::vector<arc*> arc_list;` which stores the pointer which points to `struct arc` and use that pointer to access the elements inside the vector `std::vector<point> pt_l` 

this way you dont need to use any iterators 
© www.soinside.com 2019 - 2024. All rights reserved.