2014-02-27 86 views
0

我開發了一個程序,其中我接受了stl map系統本身的鍵和值。C++ STL映射鍵和值不能正常工作

我想完成以下任務。 我的密鑰範圍是從0到1000. 在向密鑰插入值之前,我必須檢查map中是否有相同的密鑰。 如果是,我必須將鍵值增加1併爲該鍵值賦值。 我正在嘗試以下方式。但我不成功。

map<int, Values> items; 

Values connection (inet_ntoa(Clientaddr.sin_addr),ntohs(Clientaddr.sin_port),inet_ntoa(Servaddr.sin_addr),ntohs(Servaddr.sin_port)); 

for(unsigned int key=0;key<=1000;key++) 
{ 
map<int,Values>::const_iterator itemsIterator=items.find(key); 

if(itemsIterator==items.end()) 
{ 
items.insert(pair<int, Values> (key, connection)); 
} 
else 
{ 
cout<<"already exist"; 
key++; 
} 
} 
+0

你打算分配給所有未使用的密鑰相同的連接?如果不是,插入後需要添加一個'break;'語句。你也不需要'key ++'這一行,因爲''''''''''''''循環的下一個循環中已經增加了'key'。 – computerfreaker

+0

如果'key + 1'也已經存在? –

+0

我想僅將一個連接分配給一個未使用的密鑰。 – user3168101

回答

0

現在您正在將連接與所有未使用的密鑰配對。你也在做一些我不太明白的地方,如果它存在於地圖中,你會雙倍增加key。這應該解決這兩個問題:

map<int, Values> items; 

Values connection (inet_ntoa(Clientaddr.sin_addr),ntohs(Clientaddr.sin_port),inet_ntoa(Servaddr.sin_addr),ntohs(Servaddr.sin_port)); 

for(unsigned int key=0;key<=1000;key++) 
{ 
    map<int,Values>::const_iterator itemsIterator=items.find(key); //try to find the key in the map 

    if(itemsIterator==items.end()) //if the key doesn't currently exist in the map 
    { 
    items.insert(pair<int, Values> (key, connection)); //add it to the map with the connection 
    break; //and exit the loop 
    } 
    else //the key already exists, try the next one in the next pass of the for loop 
    { 
    cout<<"already exist"; 
    } 
} 
0

我看到您提供的代碼段中存在四個缺陷。

首先,您將映射定義爲具有key_type int,而在循環中則使用鍵unsigned int的類型。雖然這不是一個錯誤,但會使代碼不太清晰。因此,您應該決定key_type是int還是unsigned int在循環中,最好指定key_type而不是明確指定某種整數類型。

所以我會寫循環的控制語句

for (std::map<int, Values>::key_type key = 0; key <= 1000; key++) 

另外你在循環增加鍵兩次,如果它已經存在於地圖上。

for(unsigned int key=0;key<=1000;key++) 
{ 
//... 
else 
{ 
cout<<"already exist"; 
key++; 
} 
} 

它在控制語句本身和其他的複合語句中增加了。

第三個缺陷是,你不叫在聲明中

items.insert(pair<int, Values> (key, connection)); 

功能連接。在該聲明中表達connection具有指針類型的工作。我認爲你必須調用函數來獲取函數計算的值。

和第四缺陷是聲明

Values connection (inet_ntoa(Clientaddr.sin_addr),ntohs(Clientaddr.sin_port),inet_ntoa(Servaddr.sin_addr),ntohs(Servaddr.sin_port)); 

的不正確的語法目前尚不清楚它是否是一個函數調用或函數聲明。

所以我重寫代碼段爲

std::map<int, Values> items; 

for(std::map<int, Values>::key_type key = 0; key <= 1000; key++) 
{ 
    std::map<int, Values>::const_iterator itemsIterator = items.find(key); 

    if(itemsIterator == items.end()) 
    { 
     items.insert(pair<int, Values>(key, connection(/*arguments of the function*/))); 
    } 
    else 
    { 
     cout << key << " already exists"; 
    } 
}