2011-07-10 16 views
1

在我的代碼,我有以下部分:C++值不被改變一個隱藏的方式

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 

_some定義: vals定義as:

std::map<int, hqs> vals; 

and hqs is a structure:

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的值在第一和第二次運行之間改變。有什麼想法嗎?

回答

1
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

我知道,我希望它們是0,但爲什麼它們不保持0? (當我意識到他們不保持0時,問題就開始了)。 – Yotam

+1

...並且改變val.hs隻影響val,而不影響地圖中的數據。 val是你的一個地圖值的副本。 –

+0

對,我應該使用指針或其他什麼,謝謝 – Yotam

0

不需要指針。做到這一點

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

,而不是這個

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

正如你已經知道,你在地圖上改變數據的副本。

+0

我剛剛做了,我不知道哪種方式更容易跟隨 – Yotam

2

OK,既然你問什麼是「最簡單」的,儘管兩個很好的答案,也許你的意思是「什麼是最容易閱讀」 - 一個偉大的點,所以讓我們嘗試重寫:

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); 
    }