这是我遇到的问题,如果我解释不好或代码质量不好,请不要打扰我 - 到目前为止我只做了大约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;
}
答案 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 ...
}