Как объявить второй итератор внутри цикла for? - PullRequest
1 голос
/ 04 января 2012

ПРИМЕЧАНИЕ. Я знаю, что могу переместить объявление за пределы цикла.

Я хочу объявить пару переменных в цикле for:

for ( int x = 0, int y = 0 ; ; )
{
}

, но это не работает, так как я не могу указать тип после запятой ,. В этом случае удаление второго int или объявление y вне цикла решило бы проблему, но что, если я хочу объявить обе переменные внутри цикла и также иметь разные типы?

Могу ли я иметь что-то вроде:

for ( int x = 0, float y = 0 ; ; )
{
}

?

Ответы [ 5 ]

8 голосов
/ 04 января 2012

Это невозможно; грамматика C ++ просто не признает этого. Самое близкое, что вы можете получить к этому, это наделить дополнительную область вокруг цикла:

{
    int x;
    float y;

    for (x=0, y=0;;) {
    }
}
5 голосов
/ 04 января 2012

нет, там можно объявлять только переменные одного типа.Что вы можете сделать, это обойти эту проблему с помощью std::pair, std::touple или с помощью аналогичной конструкции:

for(std::pair<int, float> p = std::make_pair(0, 0.0f);; )
{
    p.first++;
    p.second *= 0.5f;
}
2 голосов
/ 04 января 2012

C ++ позволяет вам сделать это:

for( struct {int x; float y;} s; s.x<10; s.x++,s.y*=2.0f) {

}

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

0 голосов
/ 04 января 2012

Вы не можете.

Я бы предложил разделить код внутри на отдельную функцию, чтобы сделать его читабельным:

template<typename O, typename I>
O copy(I in, I end, O out) {
    for(; in != end; ++in, ++out)
        *out = *in;
    return out;
}

ИМО, это намного приятнее, чем изобретатьновая область действия или продление времени жизни итераторов, а также заставляет задуматься, можно ли обобщить код.

0 голосов
/ 04 января 2012

Нет, это невозможно, все они должны быть одного типа.

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