c ++ Значения в карте структур действительно изменяются скрытно - PullRequest
1 голос
/ 10 июля 2011

В моем коде есть следующий раздел:

void do_avg(){
  std::map<int,hqs>::iterator it = vals.begin();
  while(it != vals.end()){
    int q = (*it).first;
    hqs val = (*it++).second;
    val.hs = 0;
    printf("%i: %f\n",q,val.hs);
  }
  it = vals.begin();
  while (it != vals.end()){
    int q = (*it).first;
    hqs val = (*it++).second;
    printf("%i: %f\n",q,val.hs);
  }
}

печать:

0: 0.000000
1: 0.000000
2: 0.000000
4: 0.000000
5: 0.000000
8: 0.000000
9: 0.000000
10: 0.000000
13: 0.000000
0: 14.713500
1: 0.050911
2: 0.006717
4: 0.074708
5: 0.020139
8: 0.049042
9: 0.033990
10: 0.033952
13: 0.005567

_ Некоторые определения: vals определяется как:

std::map<int, hqs> vals;

и hqs - это структура:

typedef struct{
        short q;
        double hs;
        std::vector <double> ah;
        double error;
        short counter;
}hqs;

заголовок кода также включает в себя:

#include <map>
#include <math.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>

void do_avg();

По какой-то причине значения val.hs меняются между первым и вторым прогоном. Есть мысли?

Ответы [ 3 ]

2 голосов
/ 10 июля 2011

Хорошо, поскольку вы спрашиваете, что «проще всего», несмотря на два хороших ответа, возможно, вы имеете в виду «что легче всего читать» - отличный момент, поэтому давайте попробуем переписать:

void do_avg()
{
  typedef std::map<int,hqs>::iterator hqs_map_it;

  // Assign
  for (hqs_map_it it = vals.begin(), end = vals.end(); it != end; ++it)
  {
    it->second = 0;
    printf("%i: %f\n", it->first, it->second);
  }

  // Check
  for (hqs_map_it it = vals.begin(), end = vals.end(); it != end; ++it)
  {
    printf("%i: %f\n", it->first, it->second);
  }
}

Если вы действительно хотите использовать именованные переменные в цикле, используйте ссылки:

  for (hqs_map_it it = vals.begin(), end = vals.end(); it != end; ++it)
  {
    const int & q = it->first;
    hqs     & val = it->second;
    val.hs = 0; // now using the reference to update the map's value!
    printf("%i: %f\n", q, val);
  }
1 голос
/ 10 июля 2011
    val.hs = 0; -----------------------> You are printing this
    printf("%i: %f\n",q,val.hs);

При первом запуске вы явно устанавливаете переменную на ноль и печатаете ее.

[РЕДАКТИРОВАТЬ]: Как говорится в вашем комментарии, вы пытаетесь изменить содержимое карты и установить ее на0. Итак, вот объяснение того, почему это не работает:

Своим первым утверждением вы не изменяете содержимое карты и т. Д.
val является лишь копией содержимоговнутри карты.Изменение его не влияет на значения внутри карты.

hqs val = (*it++).second;

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

(*it++).second.hs

, а не его копию.

0 голосов
/ 10 июля 2011

Нет необходимости в указателе.Сделайте это

(*it++).second.hs = 0;

вместо этого

hqs val = (*it++).second;
val.hs = 0;

Как вы уже знаете, вы меняли копию данных на карте.

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