stl::sort()正在更改正在排序的对象的属性
stl::sort() is changing the attributes of the objects it is sorting
我一直在使用Brown算法为图着色问题编写解决方案。该算法运行得很好,但为了提高一点效率,我试图根据节点的程度对其进行排序。为此,我使用stl::sort()
。尽管如此,在排序了元素之后,每个元素的adyacy列表都被修改了。我有4个文件:
nodo.h:
class Nodo{
private:
int id;
int color;
vector<Nodo*> adyacentes;
public:
int grado;
vector<Nodo*> getAdyacentes();
int getId();
int getColor();
}
nodo.cpp->包括getter的基本实现。
grafo.h:
class Grafo{
private:
Nodo *nodos;
int tam;
public:
void colorearBrown();
void imprimir();
}
grafo.cpp:
void Grafo::imprimir(){
cout << setw(6) << "Numero" << setw(5) << " Color" << " Nodos adyacentes" << endl;
for(int i = 0; i < tam; ++ i){
cout << setw(6) << nodos[i].getId() << setw(5) << nodos[i].getColor() << " ";
vector<Nodo*> ady = nodos[i].getAdyacentes();
for(vector<Nodo*>::iterator it = ady.begin(); it != ady.end(); ++ it){
if (it != ady.begin()){
cout << ",";
}
cout << (*it)->getId();
}
cout << endl;
}
}
bool operator<(const Nodo& a, const Nodo& b){
return (a.grado >= b.grado);
}
void Grafo::colorearBrown(){
imprimir();
sort(&nodos[0], &nodos[tam]);
cout << endl << endl;
imprimir();
}
就是这样。假设我在"Grafo"对象中有一个正确加载的图,我运行方法colorearBrown()
,得到以下输出(部分):
.
.
.
16 -1 1,22,36,43,47,48
17 -1 10,13,20,22,44,47
18 -1 27,32,48
19 -1 4,32,36
20 -1 6,8,10,12,17,33,36,38,43,45,48
21 -1 4,6,45
22 -1 6,16,17,26,30,31
23 -1 3,8,10,14,24,26,32,36
.
.
.
Numero Color Nodos adyacentes
20 -1 4,42,22,32,10,3,34,50,18,19,25
7 -1 20,32,6,13,3,50,2,18,31,19
36 -1 7,14,16,44,12,38,30,1,50,37
14 -1 22,30,49,24,2,11,40,5
.
.
.
查看adyacent节点列表在节点20上的变化情况(此处),但对所有节点都会重复此操作。
该程序完美地编译,如果不进行排序,则节点在整个孔执行过程中保持不变。
任何关于排序算法为什么会扰乱我的结构的想法都会很有帮助。
std::sort
复制(或移动,在C++11中)对象。然而,对象中有指针,指向对象所在的位置。排序后,该位置还有另一个对象。
把它想象成人们坐在椅子上。你给每个人一个椅子的列表,"相邻"的人坐在那里。然后你要求人们换个地方。人们换地方不会改变纸上写的东西。
人是节点对象,位置是数组中的位置,带有列表的纸片是指向相邻节点的指针向量。
该问题的一个简单解决方案是使用std::list
并使用其sort
成员函数进行排序。该成员函数不移动对象,只是重新链接内部节点,因此指针将继续指向正确的对象。该解决方案的一个缺点(在您的情况下可能很重要,也可能无关紧要)是列表不提供随机访问。
相关文章:
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 对象接收堆栈溢出异常 c++ 的排序向量
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 排序谓词没有传递对索引对象的引用?
- 使用指针指向对象C++对向量进行排序
- 按类成员的顺序对包含类对象的C++向量进行排序
- 无法使用接口类型对priority_queue中的对象进行排序<T>
- 基于不同字段的对象向量的排序功能
- 基于3个对象的自定义排序
- 尝试使用比较运算符对对象向量进行排序
- C++排序的对象集
- 从文件中读取并将其内容放入对象数组中,然后对它们进行排序
- q排序类对象的列表
- std::atexit 从全局对象的构造函数调用时的排序
- 尝试对对象数组进行排序时程序终止
- std::排序为排序自定义对象时出现的向量引发错误
- 使用sort()算法C 排序对象列表
- 使用std::sort与自定义排序对象和数据类型模板-寻找正确的语法
- 快速方法部分排序对象
- 如何在动态内存中排序对象列表,在c++中使用泛型向量