在Visual Studio 2010 x64中使用地图时出现运行时间错误。

问题描述 投票:0回答:5

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

请在这里找到错误。

enter image description here

c++ map
5个回答
1
投票

方法 map.at 你刚刚创建了地图,所以你的元素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
}

4
投票

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";

1
投票

这是因为... at 函数期望该条目已经存在,但实际上并不存在。

你可以使用普通的索引操作符 [] 来创建不存在的条目。但我建议你不要使用 new 来分配一个 map 指针。

map <int, string> sss;

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

1
投票

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

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

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();
© www.soinside.com 2019 - 2024. All rights reserved.