我一直试图在Visual Studio 2010中创建一个示例应用程序。我不知道问题出在哪里,因为代码完全可以编译,但却出现了运行时错误。下面是代码。
#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;
}
错误是在main的第2行抛出的。
sss->at(0) = "Jan";
请在这里找到错误。
方法 map.at
你刚刚创建了地图,所以你的元素0是空的。 使用 insert
并阅读这个关于地图的文档。
我建议你也要避免 for 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
}
从 http:/en.cppreference.comwcppcontainermapat。:
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";
这是因为... at
函数期望该条目已经存在,但实际上并不存在。
你可以使用普通的索引操作符 []
来创建不存在的条目。但我建议你不要使用 new
来分配一个 map
指针。
map <int, string> sss;
sss[0] = "Jan";
// etc.
map::at需要一个现有元素的索引。要创建一个新的元素,使用 operator[]。
sss[0] = "Jan";
sss[1] = "Feb";
...
前面的回答已经解释了这个问题,但是看到你似乎是在编译C++11(使用了 at()
)为什么不使用新的初始化列表方式。
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();