是否可以使用foreach循环比较数组中的两个变量?

时间:2019-06-18 17:03:53

标签: c++ foreach

有什么方法可以将数组中的两个元素与cpp中的每个循环进行比较?

int [] s {1,2,3,3,3,4,5};
int size = 7;
for(int i = 0 ; i< size;i++){
if(s[i] == s[i+1]){
//instructions 
}
}

是否可以通过

做同样的事情
for(int x : s){
//required part to be answered
}

是否可以通过foreach循环进行这种比较?

4 个答案:

答案 0 :(得分:3)

  

是否可以通过foreach循环进行这种比较?

简短答案:否。

长答案:

您能找到的最接近的是:

for(int& x : s){
   int* p1 = &x;
   int* p2 = p1 + 1;
   if ( *p1 == *p2 ) { ... }
}

但是,当x对应于数组的最后一个元素时,p2指向数组中最后一个元素之外的元素。此时取消引用p2会导致行为未定义。

在修复了编译器错误和逻辑错误之后,最好还是坚持第一种方法。

int s[] = {1,2,3,3,3,4,5};
int size = sizeof(s)/sizeof(s[0]);

for(int i = 0 ; i < size - 1; i++){
   if(s[i] == s[i+1]){
      //instructions 
   }
}

答案 1 :(得分:0)

不,在每个循环中都不能进行这种类型的比较。

答案 2 :(得分:0)

如果编译器支持C ++ 17,则可以通过以下方式使用基于范围的for循环

int a[] = { 1, 2, 3, 3, 3, 4, 5 };

for ( int prev = 0; const auto &current : a )
{
    if ( prev == current ) std::cout << "Adjacent elements equal to " << prev << '\n';

    prev = current;
}        

我想数组的第一个元素不等于0。

答案 3 :(得分:0)

您不能为此直接使用范围。

标准提供了std::adjacent_find,可以帮助您:

int s[] = {1,2,3,3,3,4,5};

for (auto it = std::adjacent_find(std::begin(s), std::end(s));
     it != std::end(s);
     it = std::adjacent_find(std::next(it), std::end(s)))
{
    // instructions
}