【问题标题】:Modifying iterator inside for loop在for循环中修改迭代器
【发布时间】:2017-08-23 11:36:18
【问题描述】:

我有这样的问题: 我得到了数组的大小和数组本身(所有元素),我需要按照数组中第一项(我们称之为关键项)的放置方式对数组进行排序,以便所有小于关键项的项从关键项离开并且所有大于关键项目的项目都正确地形成关键项目,但这些项目需要与它们在声明中的顺序相同,如下所示: 数组输入:

4 7 3 5 6 2 9 1 10 8

数组输出:

3 2 1 4 7 5 6 9 10 8

所以我想我可以只通过数组一次,如果值较小,则关键项交换它们,如果值大于关键项,则将该值 (item) 放在最后(如果数组中有 n 项将它放在 n+1 位置),然后将所有项目从当前索引向左移动一个位置,例如:

| 4 | 7 | 3 | 5 | 6 | 2 | 9 | 1  | 10 | 8 |

| 4 |   | 3 | 5 | 6 | 2 | 9 | 1  | 10 | 8 | 7 |

| 4 | 3 | 5 | 6 | 2 | 9 | 1 | 10 | 8 | 7 |

但是像这样我需要在每次移动后使迭代器保持不变(这样它就可以再次检查那个地方。 我有这样的代码:

int u=1;
for (int i=1;i<n;i++){
    if (x[i]<x[u]){
       swap(x[i],x[u]);
       u+=1;
    }else {
        x[i]=x[n];
        for (int k=i;k<n-1;k++){x[k]=x[k+1];}
        i--;
    }
}

我认为我在交换部分中犯了一个错误,但我无法弄清楚。

【问题讨论】:

  • 假设x 是一个数组或类似数组的类型,您确定x[n] 是您数组中的合法元素吗?如果您有一个数组int x[n],那么您可以访问的最后一个元素是x[n-1];。您不能将元素放置在数组末尾之外并期望它会增长以适应它。
  • 我有 int x[100] 并且在输入中我只填写了 10 个(101 个?)个地方

标签: c++ arrays for-loop iterator


【解决方案1】:

您要查找的内容可以使用 STL 的 std::stable_partition() 算法完成:

将元素分成两组,同时保持它们的相对顺序

让它为你做艰苦的工作,例如:

#include <iostream>
#include <algorithm>

struct doPartitionOn
{
    int m_key;

    doPartitionOn(int key) : m_key(key) {}

    bool operator()(int a)
    {
        return (a < m_key);
    }
};

int main()
{
    int arr[] = {4, 7, 3, 5, 6, 2, 9, 1, 10, 8};

    for(int i = 0; i < 10; ++i)
        std::cout << arr[i] << ' ';
    std::cout << std::endl;

    std::stable_partition(arr, arr+10, doPartitionOn(arr[0]));

    for(int i = 0; i < 10; ++i)
        std::cout << arr[i] << ' ';
    std::cout << std::endl;

    std::cin.get();
    return 0;
}

4 7 3 5 6 2 9 1 10 8
3 2 1 4 7 5 6 9 10 8

Live demo

或者,如果使用 C++11 或更高版本,您可以使用 lambda 代替手动仿函数:

#include <iostream>
#include <algorithm>

int main()
{
    int arr[] = {4, 7, 3, 5, 6, 2, 9, 1, 10, 8};

    for(int value: arr)
        std::cout << value << ' ';
    std::cout << std::endl;

    std::stable_partition(arr, arr+10, [&arr](int a){ return (a < arr[0]); });

    for(int value: arr)
        std::cout << value << ' ';
    std::cout << std::endl;

    std::cin.get();
    return 0;
}

4 7 3 5 6 2 9 1 10 8
3 2 1 4 7 5 6 9 10 8

Live demo

【讨论】:

  • @anakata 再仔细看看我的例子。他们只使用一个数组并对其进行内联排序,就像您尝试做的那样。你有没有试过我给你的代码?
  • 对不起,我赶时间了。你的代码看起来不错,但我想在没有所有预定义函数的情况下这样做 (doPartitionOn) :)
  • @anakata:那么我建议你查看std::stable_partition() 的源代码,看看它是如何执行排序的。
猜你喜欢
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2014-11-09
  • 2022-01-14
相关资源
最近更新 更多