【问题标题】:Finding not equal adjacent indexes in vector在向量中找到不相等的相邻索引
【发布时间】:2019-05-30 12:02:48
【问题描述】:

我有这个整数向量:

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)。任何帮助表示赞赏!

【问题讨论】:

  • 你能用文字准确地描述“索引,相邻元素不相等的地方”对你意味着什么吗?
  • @JohnZwinck 值 1, 2 不相等,因此最后一个值的索引 1(即 1)。然后2, 3 不相等,所以最后一个值的索引2(即4)。然后我们剩下最后一个值 3,所以也输出这个索引(即 5)。但是,是的,正如@marek-r 所说,问题的表述可能不正确..

标签: c++ algorithm vector iterator


【解决方案1】:

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

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;
}

【讨论】:

    【解决方案2】:

    假设它总是以这种方式处理最后一个索引,您可以在其他正确结果中从最后一个值中减去 1。

    【讨论】:

      【解决方案3】:

      尝试以下方法(我将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 ) )
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多