Странное поведение вектора? - PullRequest
1 голос
/ 21 января 2011

У меня есть программа, которая просто добавляет два вектора v1 и v2 следующим образом: v1 + = v2.На каждой итерации v2 добавляется к v1.Рассмотрим следующую программу:

    #include <iostream>
    #include <vector>
    #include <iterator>

    using namespace std;

    typedef vector<double> v_t;

    int main(){

    v_t v1;
    v_t v2;

    for (int i = 1; i<10; i++){
      v1.push_back(i);
      v2.push_back(i);
      if (i == 5){            // Just want to insert a 0 inbetween
        v1.push_back(0);
        v2.push_back(0);
      }
    }

 // v1 :  1 2 3 4 5 0 6 7 8 9
 // v2 :  1 2 3 4 5 0 6 7 8 9

    v_t::iterator it2(v2.begin());
      for(v_t::iterator it(v1.begin()), end(v1.end()); it != end; )
      *(it++) += *(it2++);

    copy(v1.begin(), v1.end(), ostream_iterator<double>(cout, " "));
      cout << endl;
    }

Вывод программы:

 2 4 6 8 10 0 12 14 16 18  // This is correct and what I need

, но если я изменю цикл for следующим образом:

.
.
.
v_t::iterator it2(v2.begin());
  for(v_t::iterator it(v1.begin()), end(v1.end()); it != end && ( *(it++) += *(it2++) ); );

 copy(v1.begin(), v1.end(), ostream_iterator<double>(cout, " "));
      cout << endl;
    }

Сейчасвывод:

2 4 6 8 10 0 6 7 8 9 

т.е. всякий раз, когда он встречает 0 в одном и том же месте в обоих векторах, он прекращает добавление.Зачем ?Более 0 не означает конец какого-либо вектора, не так ли?Это также значение.

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

Ответы [ 5 ]

3 голосов
/ 21 января 2011

Это потому, что вы проверяете ( *(it++) += *(it2++) ) как условие завершения цикла.Поэтому, когда он достигает 6-го элемента, ноль, он обнуляется, что не соответствует условию it != end && ( *(it++) += *(it2++) ); и завершает цикл.

for(v_t::iterator it(v1.begin()), end(v1.end()); it != end && ( *(it++) += *(it2++) ); );

Должно быть:

for(v_t::iterator it(v1.begin()), end(v1.end()); it != end; ( *(it++) += *(it2++) ) );

2 голосов
/ 21 января 2011

Это потому, что результат

( *(it++) += *(it2++) );

равно нулю, когда * it и * it2 равны нулю. И ноль - это ложь в C (как и в C ++).

Кстати, попробуйте разделить приращения операторов и выполнять фактическую работу в векторе. Это делает код очень грязным, чтобы делать такие сложные вещи вместе (и это не делает вас лучшим программистом;)

1 голос
/ 21 января 2011

Если в последнем случае условие for for включает выражение *(it++) += *(it2++).

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

Почему вы делаете добавление как побочный эффект в состоянии цикла?

1 голос
/ 21 января 2011

Состояние вашего цикла for it != end && *(it++) += *(it2++).Если оба значения *it и *it2 равны 0, *(it++) += *(it2++) будет иметь значение 0, поэтому ваше условие ложно и цикл завершается.

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

for(v_t::iterator it(v1.begin()), end(v1.end()); it != end; *(it++) += *(it2++))
0 голосов
/ 21 января 2011

Останавливается из-за условной части вашего цикла:

it != end && ( *(it++) += *(it2++) )

Когда они равны нулю, условие оценивается как ложное.

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