指针数组有问题。 我有一个名为 C 的自定义类。 C有一个变量 double c1 。我必须使用自定义编写的排序算法按c1对C-s数组进行排序。我猜测,因为我必须在数组中移动对象,所以将指针移动到对象会更加有效,因此我不得使用对象数组,而是指向对象的指针数组。
我像这样初始化了数组:
C** someC;
someC = new C*[size];
for(int i = 0; i < size; i++) {
// a and b are of type CPoint
someC[i] = new C(a,b);
}
我正确地做这个部分吗?然后调用C对象会导致问题:
someC[i]->a.x
给我一个错误:' - &gt; a'必须指向class / struct / union / generic类型
我是C ++的新手,所以我可能会遗漏一些明显的东西,但是我做了一些研究而没有找到任何东西。也许我不太了解指针是如何工作的......
更新
C类的头文件:
#pragma once
class C
{
public:
CPoint a;
CPoint b;
double c1;
C(void);
C(CPoint,CPoint);
~C(void);
};
实施:
#include "StdAfx.h"
#include "C.h"
#include <math.h>
C::C(void)
{
}
C::C(CPoint a, CPoint b)
{
this->a=a;
this->b=b;
double c1_x = a.x - b.x;
double c1_y = a.y - b.y;
c1= sqrt( (c1_x * c1_x) + (c1_y * c1_y));
}
C::~C(void)
{
}
更新
问题出在我在评论中提供的代码中,我没有注意到我是以错误的方式调用数组:
pDC->MoveTo(someC[i]->a.x, someC->a.y)
所以第二次通话不正确。谢谢大家的帮助
答案 0 :(得分:2)
除非你的C
对象复制构造真的非常昂贵,否则不要费心实施自定义排序算法,而是定义严格的总订单超过C
:
bool operator<(C const& lhs, C const& rhs) {
return lhs.c1 < rhs.c1;
}
并在std::sort
上使用std::vector<C>
。如果您确实担心复制构建开销,您也可以直接使用std::set<C>
自动排序,不用复制构建。
编辑后:您的C
似乎相对较小且易于复制,但它是边缘线;你最好的选择是给出两种方法(set
和vector
)和基准哪一种更快。
答案 1 :(得分:2)
除了哲学之外,从你的评论(强调增加)中可以看出这一点:
“我实际上是在OnDraw方法中调用someC: pDC->MoveTo(someC[i]->a.x, someC->a.y);
someC在头文件中定义为public”
具体来说,这在您的参数列表中:
someC[i]->a.x, someC->a.y
这告诉我其中一个是错误的。从你的错误来看,我将选择第一个。如果我们能够看到正在实施OnDraw()
的对象的定义以及完全,那么它将会得到someC
。
someC
在您的包含对象中是C*
,则第二个参数是正确的,第一个参数是错误的。 someC
在您包含的对象中是C **,那么第一个参数是正确的,第二个参数是错误的。答案 2 :(得分:0)
如果您的类型仅包含double
我猜测使用指针会更快不!如果对象包含std::string
或std::vector<T>
(有一段时间T
),图片可能会发生变化,但与移动带有一个或两个基本对象的结构相比,访问更多或较少随机分布的数据相当高。当然,要确定具体情况,您需要对两种方法进行分析。