C++ 在c++;没有完成排序
我有一个STLC++ 在c++;没有完成排序,c++,list,sorting,pointers,shared,C++,List,Sorting,Pointers,Shared,我有一个STLstd::list,共有5个共享指针,指向需要按各自的id编号排序的节点对象 do { check = 0, i = 0; auto it = newList.begin(); while (i < newList.size() - 1) { first = *it; second = *++it; if (comp_id(first, second)) {
std::list
,共有5个共享指针,指向需要按各自的id
编号排序的节点对象
do
{
check = 0, i = 0;
auto it = newList.begin();
while (i < newList.size() - 1)
{
first = *it;
second = *++it;
if (comp_id(first, second))
{
temp = second;
second = first;
first = temp;
check = 1;
}
i++;
}
} while (check == 1);
do
{
check=0,i=0;
auto it=newList.begin();
而(i
在这段代码中,comp_id()
返回true,并在整个组织中运行,但在发生时,列表中没有任何变化。我希望能从一些角度了解为什么会发生这种情况,以及如何解决它
另外,我不允许使用list\u name.sort()
方法:(该方法不起作用的原因是,您只修改了本地变量(第一个和第二个),它们是列表中值的副本。您根本没有修改列表的实际内容
要使代码正常工作,只需将第一个
和第二个
变量更改为列表迭代器,然后在需要访问它们的值时取消对它们的引用,例如:
auto size = newList.size();
if (size > 1)
{
--size;
do
{
check = 0, i = 0;
auto it = newList.begin();
while (i < size)
{
auto first = it;
auto second = ++it;
if (comp_id(*first, *second))
{
auto temp = *second;
*second = *first;
*first = temp;
check = 1;
}
++i;
}
}
while (check == 1);
}
second=*++it;
这里你可能需要:second=*(it+1);
确认你的老师有幽默感,然后使用std::sort
@RemyLebeau(顺便说一句,名字不错)我的教授限制我不使用排序函数,以便我们更全面地掌握共享指针和列表的具体含义。这么说,我现在明白我并不是在编辑列表,我现在的问题是我如何才能准确地进行编辑。@NicholasProvencal只需先更改你的
和second
将变量放入迭代器,然后在将其值传递给comp_id()时取消对它们的引用
,或者交换它们的值,所以我需要取消对每个指针的引用,以便让该方法实际编辑列表。我所做的只是将周围的指针交换到指针,对吗?@NicholasProvencal类似的东西。在您的原始代码中,第一个
和第二个
是本地的共享的\u ptrit
,所以first=*it
和second=*++it
正在从列表中复制对象,然后您正在比较/交换副本,而不是原始副本。通过将first
和second
变量更改为迭代器,可以避免副本和直接比较/交换原件。非常好,非常感谢。这也帮助我解决了我代码其余部分的大部分问题。我在原始问题上添加了另一个问题,希望您能解决一些问题light@NicholasProvencal这不是同一个问题,你应该把它作为一个新问题发布,并附上一个。在任何情况下,onl我看到的是,bikelist
是通过值传递的,而不是通过引用传递的,因此创建了列表的副本,但这不会影响结果,因为代码没有修改bikelist
本身,所以通过值传递只是错过了优化。代码正在访问原始列表所包含的原始Bike
对象指向。没有Bike
复制品。那么您的实际问题是什么?全局范围与任何事情有什么关系?
if (newList.size() > 1)
{
auto begin = newList.begin();
auto end = newList.end()-1;
do
{
check = 0;
auto it = begin;
while (it != end)
{
auto first = it;
auto second = ++it;
if (comp_id(*first, *second))
{
auto temp = *second;
*second = *first;
*first = temp;
check = 1;
}
}
}
while (check == 1);
}