我有这个整数向量:
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)。任何帮助表示赞赏!
答案 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。