c++ - 我的迭代器没有按照预期的方式工作

标签 c++ stl iterator c++14

因此,这是我用于选择排序的代码,由于某种原因,我在其中交换两个元素的部分不起作用,并给出了各种奇怪的输出。

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;

请帮助我找出问题所在。

最佳答案

欢迎使用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<<" ";
}

最好的祝福!

关于c++ - 我的迭代器没有按照预期的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60528507/

相关文章:

c++ - nullptr 与 __nullptr

c++ - Libspotify 简单的 Hello World

c++ - 在 C++ Windows 10 桌面应用程序中获取 BLE 信标

c++ - 无法在 Mac 上访问 std vector 迭代器 _Ptr

c++ - 如何使用 C++ Boost 的 regex_iterator()

C++ 模板和函数解析

c++ - 从 std::multimap<> 中删除项目后,我可以继续使用迭代器吗?

c++ - 使用 std::remove_if 跟踪删除的元素

c++ - std::map clear() 在调试器中的性能?

c++ - 如何在 C 风格数组上使用 find_if 和 reverse_iterator?