这是我遇到的问题,如果我解释得不好或者代码质量很差,请不要打我 - 到目前为止我只学了大约两周的 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;
}
一些建议:
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 ...
}
#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