2012-12-17 95 views
1

这里是我遇到的问题,如果我没有很好地解释它或者代码质量很差,请不要殴打我 - 我到目前为止只做了大约2周的C++ 。访问C++结构的各个元素

说明:我想构建一个结构(一个结构可能不是最好的决定,但我必须从某处开始),它将包含一组点的坐标(仅限x和y)(我们称之为设置弧),设置ID(可能还有其他字段)。每组(弧)可以包含各种数量的点。 我已经在集合(弧)中实现了每个点作为类,然后我的弧结构在矢量中包含了这个类的各种实例(以及其他东西)。弧形结构的

实施例:

Struc1:

ID(INT)1

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

Struc2:

ID( INT)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; 
} 

回答

1

一对夫妇的建议:

  • 不要单独pointClassVector麻烦,只需创建,取而代之的是直接指向对象为arcStruc。 xY通过使用arcStruc.xY.push_back()。行arcStruc.xY = pointClassVector触发整个向量的副本,这有点浪费CPU周期。
  • 绝对没有必要尝试在堆上创建一个Point对象,所有这些都会增加复杂性。只需使用Point pt;并调用它的设置功能 - 虽然我个人会完全废除设置的功能并直接在Point中操作数据,但不需要获取/设置人员,他们也不会为您购买任何东西。如果这是我的代码,我会写点构造函数以x和y为参数,这会为您节省大量不必要的代码。你也不需要为析构函数提供一个实现,编译器生成的就没有问题。

如果你想遍历vector,你应该使用迭代器而不是试图索引到容器中。无论哪种方式,你可以访问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

做你的意思是这样的(见我的编辑解决方案?)。就目前而言,它在'arcStruc.xY.push_back(pt.getX());'上失败了,'但是我从你的回答中不明白你如何使用'arcStruc.xY.push_back()'。 – Aina

+0

您想要使用arcStruc.xY.push_back(pt),因为您要将整个Point对象添加到矢量中,而不是其中的一部分。 –

+0

非常感谢您的时间,我不知道您可以在push_back()内部放置任何值,但只有一个值。最后一个问题:我如何迭代struc?在我上面的代码中(再次编辑),我已经在循环中添加了'cout << arcStruc.xY.at(it);'但它会抛出一个错误。我也尝试过'cout << arcStruc.xY [it];'但它也抛出了一个错误,这样做的正确方法是什么? – Aina