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

エラーはメインの 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

以前の回答で既に問題が説明されていますが、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 に答える
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 に答える