在向量中找到不相等的相邻索引

时间:2019-05-30 12:02:49

标签: c++ algorithm vector iterator

我有这个整数向量:

std::vector<int> v = {1, 1, 2, 2, 2, 3};

我想找到相邻元素不相等的索引:

1
4
5

我的解决方法是(不起作用):

std::vector<int> v = {1, 1, 2, 2, 2, 3};

auto i1 = std::begin(v);

while(1)
{
    i1 = std::adjacent_find(i1, std::end(v), std::not_equal_to<int>());
    std::cout << std::distance(std::begin(v), i1) << '\n';

    if (i1++ == std::end(v))
        break;
}

此打印:

1
4
6

最后一个元素指向索引6,但我希望它指向5(值3)。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

您的代码和预期答案无效。此数据的正确答案是:

1
4

循环的最后一次迭代会将没有发现任何有效结果的结果视为结果。 这就是为什么您将数组的大小作为最后的结果。

因此固定代码如下:

std::vector<int> v = {1, 1, 2, 2, 2, 3};

auto i1 = std::begin(v);

while(1)
{
    i1 = std::adjacent_find(i1, std::end(v), std::not_equal_to<int>());
    if (i1 == std::end(v))
        break;

    std::cout << std::distance(std::begin(v), i1) << '\n';
    ++i1;
}

答案 1 :(得分:1)

尝试以下方法(我将i1重命名为it

#include <iostream>
#include <functional>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<int> v = { 1, 1, 2, 2, 2, 3 };

    auto it = std::begin(v);

    do
    {
        it = std::adjacent_find( it, std::end(v), std::not_equal_to<int>());
        if ( it == std::end( v ) ) it = std::prev( it );

        std::cout << std::distance(std::begin(v), it) << '\n';

        std::advance( it, 1 );
    } while ( it  != std::end( v ) );        
}

程序输出为

1
4
5

在调用do-while循环之前,应检查向量是否为空。

例如

#include <iostream>
#include <functional>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<int> v = { 1, 1, 2, 2, 2, 3 };

    if ( not v.empty() )
    {
        auto it = std::begin(v);

        do
        {
            it = std::adjacent_find( it, std::end(v), std::not_equal_to<int>());
            if ( it == std::end( v ) ) it = std::prev( it );

            std::cout << std::distance(std::begin(v), it) << '\n';

            std::advance( it, 1 );
        } while ( it  != std::end( v ) );
    }        
}

关于您的方法,您正在尝试输出

std::distance(std::begin(v), std::end( v ) )

6等于i1时等于std::end( v )

答案 2 :(得分:0)

假设它将始终以这种方式处理最后一个索引,则可以从否则为正确结果的最后一个值中减去1。