【问题标题】:My iterators are not working the way they are supposed to be working我的迭代器没有按照应有的方式工作
【发布时间】: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 但我是迭代器的新手,为了实现对它们的命令,我正在使用迭代器实现所有标准算法,因此方式代码看起来。但无论如何感谢您的帮助。

标签: c++ stl iterator c++14


【解决方案1】:

欢迎使用 C++!

这里的主要问题是迭代器i 指向与迭代器min 相同的对象。

你真正得到的是

    *i=*i+*i;
    *i=*i-*i;
    *i=*i-*i;

因此你会得到一个零结果!

为了解决迭代器相等时不能交换的问题。

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;
        }
    }
    if (i==min) continue; // ADD THIS
    *i=*i+*min;
    *min=*i-*min;
    *i=*i-*min;
}
for(int x:vect)
{
    cout<<x<<" ";
}

最好的问候!

【讨论】:

  • 虽然这更正了代码,但坦率地说,它是不可读的,并且执行“魔术”交换的速度较慢。 std::swap 更好。
【解决方案2】:

你总是需要一个临时变量来交换两个元素。这就像你想交换两个杯子,你需要第三个。

【讨论】:

  • 真的吗?我的印象是 a=a+b; b=a-b; a=a-b 成功交换 a 和 b。
  • @astormofswords 如果ab 的别名,则会失败
猜你喜欢
  • 1970-01-01
  • 2022-12-13
  • 2012-01-13
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多