2013-01-11 88 views
0

我一直在試圖在Visual Studio 2010中創建一個示例應用程序。我沒有得到什麼問題,因爲代碼是完美編譯的,但是提供了運行時錯誤。這裏是代碼:在Visual Studio 2010中映射的運行時錯誤x64

#include <Map> 
#include <string> 
#include <sstream> 
#include <iostream> 
#include <fstream> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    map <int, string> *sss = new map<int, string>; 
    sss->at(0) = "Jan"; 
    sss->at(1) = "Feb"; 
    sss->at(2) = "Mar"; 
    sss->at(3) = "Apr"; 
    sss->at(4) = "May"; 
    sss->at(5) = "Jun"; 
    string current = NULL; 
    ofstream myfile; 
    myfile.open("daily_work.txt"); 
    myfile << "***** DAILY WORK *****" << endl; 

    for(int i = 0; i < 6; i++) 
    { 
     string month = sss->at(i); 
     for(int j = 1; j < 31; j++) 
     { 
      stringstream ss; 
      ss << j; 
      current = ss.str(); 
      current.append(" "); 
      current.append(month); 
      current.append(" = "); 
      myfile << current << endl; 
     } 

     current = ""; 
    } 

    printf("Completed!"); 
    myfile.close(); 
    sss->clear(); 
    delete sss; 
    sss = NULL; 
    return 0; 
} 

錯誤在第2行被拋出。

sss->at(0) = "Jan"; 

請在這裏找到錯誤:

enter image description here

+0

at()拋出元素是否存在,是否正確?編輯:看jrok的評論 – dans3itz

回答

1

方法在您剛纔創建的地圖,這樣你就不會一無所有元素0。使用insert和閱讀有關的地圖本文檔的元素0 map.at訪問。

c++ reference map

我建議你也避免你的1到6,你應該使用迭代器的地圖。 通過這種方式,如果將元素添加到地圖中,則不需要執行其他任何操作,因爲您的循環已經正常。

使用此樣品:

typedef std::map<int, string>::iterator it_type; 
for(it_type iterator = map.begin(); iterator != map.end(); iterator++) { 
// iterator->first = key 
// iterator->second = value 

}

+1

感謝您的額外信息! :) –

4

http://en.cppreference.com/w/cpp/container/map/at

Returns a reference to the mapped value of the element with key equivalent to key. 
If no such element exists, an exception of type std::out_of_range is thrown. 

您需要:

map <int, string> sss; 
sss[ 0 ] = "Jan"; 
+0

行... 非常感謝! –

1

這是因爲at函數期望條目已經存在,但它不存在。

如果條目不存在,則可以使用標準索引運算符[]創建條目。但爲此,我建議您不要使用new來分配map指針。

map <int, string> sss; 

sss[0] = "Jan"; 
// etc. 
+0

謝謝你! 這非常有幫助。 –

1

地圖::在需要現有元素的索引。要創建一個新的元素使用操作符[]:

sss[0] = "Jan"; 
sss[1] = "Feb"; 
... 
1

以前的答案已經說明了問題,但看到你怎麼好像(使用at())爲什麼不使用新的初始化列表的方式來編譯C++ 11 :

auto sss = new map<int, string> = { 
    {0, "Jan"}, 
    {1, "Feb"}, 
    {2, "Mar"}, 
    {3, "Apr"}, 
    {4, "May"}, 
    {5, "Jun"}, 
}; 

順便說一句,你可以通過不具有currrent變量所有,只是更多地利用您的stringstring對象的整潔建立你的輸出字符串。

stringstream ss; 
ss << j << " " << month << " = \n"); 
myfile << ss.str(); 
+0

謝謝! 我會研究一下。 –