【发布时间】:2020-06-17 02:09:54
【问题描述】:
所以这是我的选择排序代码,由于某种原因,我交换两个元素的部分它不起作用并给出了各种奇怪的输出。
vector<int> vect{45,32,12,1,67,34,2,15,33,40};
for(auto i=vect.begin();i<vect.end()-1;i++){
auto min=i;
for(auto j=i+1;j<vect.end();j++)
{
if(*min>*j)
{
min=j;
}
}
*i=*i+*min;
*min=*i-*min;
*i=*i-*min;
}
for(int x:vect)
{
cout<<x<<" ";
}
但是当我使用不同的交换方式时,输出是正确的。
int temp=*min;
*min=*i;
*i=temp;
而不是:-
*i=*i+*min;
*min=*i-*min;
*i=*i-*min;
请帮我找出问题所在。
【问题讨论】:
-
使用
std::swap -
如果你会说“我不能使用 std::swap”,那么至少,创建一个交换两个值的函数。您的交换很难按原样阅读,所有取消引用都在进行中。
-
@PaulMcKenzie 我完全理解使用 std::swap 是最好的方法或创建一个函数,但我可以自己完成。我想知道我的交换出了什么问题。谢谢。
-
但我本可以自己完成的 -- 这难道不是目标,能够自己做某事,或者更好的是最佳实践吗?它不会通过实现几乎不可读和不可靠的代码来赢得分数。
-
@PaulMcKenzie 伙计,就像我说的我熟悉 std::swap 但我是迭代器的新手,为了实现对它们的命令,我正在使用迭代器实现所有标准算法,因此方式代码看起来。但无论如何感谢您的帮助。