Можно ли сравнить две переменные внутри массива с циклом foreach? - PullRequest
0 голосов
/ 18 июня 2019

Есть ли способ сравнить два элемента в массиве с a для каждого цикла в 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 ]

3 голосов
/ 18 июня 2019

Можно ли выполнить этот тип сравнения с циклом 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 
   }
}
0 голосов
/ 18 июня 2019

Для этого нельзя использовать прямой диапазон.

Стандарт предоставляет std ::acent_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
}
0 голосов
/ 18 июня 2019

Если компилятор поддерживает 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.

0 голосов
/ 18 июня 2019

Нет, вы не можете сделать этот тип сравнения для каждого цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...