0

我一直在尝试在 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";

请在此处查找错误:

在此处输入图像描述

4

5 回答 5

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";
于 2013-01-11T10:55:40.473 回答
1

这是因为该at函数期望该条目已经存在,但事实并非如此。

[]如果条目不存在,您可以使用普通索引运算符创建条目。但为此我建议您不要使用new分配map指针。

map <int, string> sss;

sss[0] = "Jan";
// etc.
于 2013-01-11T10:55:45.130 回答
1

方法map.at确实访问了元素 0。您刚刚创建了地图,因此元素 0 为空。使用insert并阅读有关地图的文档。

c++参考图

我建议你也避免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
}
于 2013-01-11T10:57:23.293 回答
1

map::at 需要现有元素的索引。要创建一个新元素,请使用 operator[]:

sss[0] = "Jan";
sss[1] = "Feb";
...
于 2013-01-11T10:58:11.947 回答
1

以前的答案已经解释了这个问题,但是看到你似乎是如何编译 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();
于 2013-01-11T11:13:22.183 回答