Что лучший способ состоит в том, чтобы сделать реверс 'для' цикла с неподписанным индексом?

Да, конечно :) A data.frame - это list, и поэтому вы можете вкладывать в него разностные структуры данных:

df <- data.frame(a = c(1,2,3), b = c("a", "b", "c"))
df$c <- list(c(1, 2, 3), c(4,5,6), c(7,8,9))

> str(df)
'data.frame':   3 obs. of  3 variables:
 $ a: num  1 2 3
 $ b: Factor w/ 3 levels "a","b","c": 1 2 3
 $ c:List of 3
  ..$ : num  1 2 3
  ..$ : num  4 5 6
  ..$ : num  7 8 9
56
задан Auron 24 May 2011 в 14:10
поделиться

19 ответов

Как насчет:

for (unsigned i = n ; i-- > 0 ; )
{
  // do stuff with i
}
94
ответ дан Tim Cooper 26 November 2019 в 17:05
поделиться
for ( unsigned int i = n-1; (n-i) >= 0; i-- ) {
    // n-i will be negative when the loop should stop.
    ...     
}
-1
ответ дан Paulo Guedes 26 November 2019 в 17:05
поделиться

Так как это не стандарт для цикла, я, вероятно, использовал бы некоторое время цикл вместо этого, например:

unsigned int i = n - 1;
while (1)
{
    /* do stuff  with i */

     if (i == 0)
    {
        break;
    }
    i--;
}
0
ответ дан starblue 26 November 2019 в 17:05
поделиться

Используйте две переменные, одну к количеству , и другой для индекса массива:

unsigned int Index = MAX - 1;
unsigned int Counter;
for(Counter = 0; Counter < MAX; Counter++)
{
    // Use Index
    Index--;
}
0
ответ дан Steve Melnikoff 26 November 2019 в 17:05
поделиться

Это не тестируется, но могли Вы делать следующее:

for (unsigned int i, j = 0; j < n; i = (n - ++j)) {
    /* do stuff with i */
}
0
ответ дан SpoonMeiser 26 November 2019 в 17:05
поделиться
unsigned index;
for (unsigned i=0; i<n; i++)
{
    index = n-1 - i; // {i == 0..n-1} => {index == n-1..0}
}
1
ответ дан user80452 26 November 2019 в 17:05
поделиться

Гм. Вот Ваши опции:

  1. Использование i=0 как Ваше условие повреждения - Цикл не выполнится, когда я достигну 0, поэтому выполните 1 повторение содержания цикла для i=0 после того, как цикл вышел.
for ( unsigned int i = n-1; i > 0; i-- ) {
    doStuff(i);
}
doStuff(0);
  1. В цикле, протестируйте на i=0 и break. Не рекомендуемый, потому что теперь Вы тестируете значение меня дважды в цикле. Также использование повреждения в цикле обычно рассматривает как плохую практику.
for ( unsigned int i = n-1; i >= 0; i-- ) {
    doStuff(i);
    if (i=0) break;
}
1
ответ дан Tim 26 November 2019 в 17:05
поделиться
for ( unsigned int i = n; i > 0; i-- ) {
    ...     
}

Должен хорошо работать. Если необходимо использовать i переменная, поскольку индекс в массив делает это как это:

array[i-1];
1
ответ дан arul 26 November 2019 в 17:05
поделиться

Единственная причина я упоминаю эту опцию, состоит в том, потому что я не видел его в списке.

for ( unsigned int i = n-1; i < n; i-- ) {
... 
}

Полностью против интуиции, но это работает. причина это работает, состоит в том, потому что вычитание 1 от 0 урожаев наибольшее число, которое может быть представлено целым числом без знака.

В целом я не думаю, что это - хорошая идея работать с целыми числами без знака и arthmetic, особенно при вычитании.

3
ответ дан Renze de Waal 26 November 2019 в 17:05
поделиться
for ( unsigned int i = n; i > 0; i-- ) {
    unsigned int x = i - 1;
    // do whatever you want with x    
}

, Конечно, не изящный, но это работает.

3
ответ дан itsmatt 26 November 2019 в 17:05
поделиться

Или Вы могли полагаться на переносящееся поведение unsigned int при необходимости в индексации от n-1 до 0

for(unsigned int i = n-1; i < n; i--) {
    ...
}
4
ответ дан peje 26 November 2019 в 17:05
поделиться
for (unsigned int i = n-1; i<(unsigned int)-1; i--)

хорошо, его "неясная кольцевая арифметика".

4
ответ дан Eric Bainville 26 November 2019 в 17:05
поделиться

Возможно, этот путь? По моему скромному мнению, его ясное и читаемое. Можно опустить, если (n> =1), если это неявно известно так или иначе.

if(n>=1) {
    // Start the loop at last index
    unsigned int i = n-1;
    do {
       // a plus: you can use i, not i-1 here
    } while( i-- != 0 );
}

Другая версия:

if(n>=1) {
    unsigned int i = n;
    do {
       i--;

    } while( i != 0 );
}

первый код без того, если оператор был бы похож:

unsigned int i = n-1;
do {

} while( i-- != 0 );
5
ответ дан 26 November 2019 в 17:05
поделиться

Я был бы склонен использовать

 for ( unsigned int i = n; i > 0; )  {
    --i;
    ...     
 }

, это - почти то же как skizz' ответ, (это пропускает заключительный ненужный декремент, но компилятор должен оптимизировать это далеко), и на самом деле передаст обзор кода. Каждый стандарт кодирования, с которым я должен был работать, имел без мутаций в условном правиле.

8
ответ дан Pete Kirkham 26 November 2019 в 17:05
поделиться
for ( unsigned int i = n; i > 0; i-- ) {
    ...  
    i-1 //wherever you've been using i   
}
8
ответ дан vartec 26 November 2019 в 17:05
поделиться
for ( unsigned int i = n; i != 0; i-- ) {
    // do something with i - 1
    ...     
}

Примечание это, если Вы используете C++, а также C, с помощью! = хорошая привычка войти для того, когда Вы переключаетесь на использование итераторов, где < = и т.д. может не быть доступным.

11
ответ дан 26 November 2019 в 17:05
поделиться
for ( unsigned int loopIndex = n; loopIndex > 0; --loopIndex ) {
    unsigned int i = loopIndex - 1;
    ...
} 

или

for ( unsigned int loopIndex = 0; loopIndex < n; ++loopIndex ) {
    unsigned int i = n - loopIndex - 1;
    ...
} 
12
ответ дан Lou Franco 26 November 2019 в 17:05
поделиться

ez:

#define unsigned signed

for ( unsigned int i = n-1; i >= 0; i-- ) { ... 
}
-3
ответ дан 26 November 2019 в 17:05
поделиться

Легко, просто остановитесь на -1:

for( unsigned int i = n; i != -1; --i )
{
 /* do stuff with i */
}

редактировать: не уверен, почему за это голосуют против. это работает, и это проще и очевиднее, чем любое из вышеперечисленных.

2
ответ дан 26 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: