我们说我定义了以下结构:
struct dockPose {
Complex* pose;
int Cluster;
struct dockPose* DP;
float Distance;
int Density;
};
typedef struct dockPose DockPose;
然后,我声明一个向量,它将使用std :: sort()函数按密度值排序。在调用std :: sort之后,我的DockPose * DP指针是否仍然指向它之前指向的相同DockPose实例?如果没有,我该怎么做才能确保DP指针指向排序前指向的相同DockPose(如果有什么我可以做的话)?
答案 0 :(得分:3)
是的,指针仍然指向同一个实例。但这可能不是你真正想要的。当你在向量上调用std::sort
时,它不会改变实例的位置(这甚至不是你在C ++中可以做的事情)。它互相交换价值。用简化的例子可能更好地解释了这一点。采取这个结构:
struct Foo
{
int x;
Foo* buddy;
};
bool operator<(Foo const& lhs, Foo const& rhs)
{
return lhs.x < rhs.x;
}
现在,让我说我制作一个这样的向量,减少x值,每个都有一个指向它后面的指针(最后一个指针指向第一个):
std::vector<Foo> vec(5);
for (int i = 0; i < 5; ++i)
{
vec[i].x = 4 - i;
vec[i].buddy = &vec[(i + 1) % 5];
}
现在,如果我对这个向量进行排序,它实际上将会逆转。但实例本身并没有改变它们的位置。相反,它们的值会发生变化,使得第一个值具有最低x
值,并且从那里开始增加。现在,指针成员随x
值一起变化。
例如,vec[0]
,x
值为4,指针vec[1]
(x
值为3)。排序后,这些值将以最后一个元素vec[4]
结束。因此,vec[4]
的{{1}}值为4,指向x
的指针(排序后的vec[1]
值为1)。
因此,在排序之前,具有x
值4的元素具有指向x
值为3的元素的指针。排序后,具有{{1}的元素value of 4有一个指向x
值为1的元素的指针。我怀疑这是你想要的。
由于您对实例的身份感兴趣,而不仅仅是他们的值,您可能应该使用x
之类的东西。对于我的x
示例,我可以执行以下操作:
std::vector<std::unique_ptr<dockPose>>
请注意,执行此操作时,需要使用其他比较功能。一个比较解除引用的指针,而不是指针本身。
答案 1 :(得分:0)
std::sort
只会在向量中移动对象,但指针本身仍将指向它们最初指向的相同内存位置。
答案 2 :(得分:0)
排序不会更改这些指针的值。指针只是保存内存地址的变量,对向量进行排序不会更改向量中对象的任何成员变量数据。
答案 3 :(得分:0)
如果你有DockPose
个对象的向量,你将它们视为值,在这种情况下,保持指向它们的指针是个坏主意。我怀疑你确实希望它们是实体(即使它们具有相同的值,两个实体也是不同的。)
在这种情况下,你应该有一个指向实体的指针向量;排序指针向量将不会使DP
指针无效。
答案 4 :(得分:0)
保持指向矢量中的对象并不是一个好主意。如果碰巧导致调整大小,即使是简单的push_back()也可能使所有指针无效。 如果要保留指向容器中对象的指针,最好使用std :: list