1

ポインターを使用して新しい要素を挿入したいのですvectorが、次のサンプルコードがあります。

struct info {
    string Name;
    int places;  // i will use the binary value to identfy the visited places example 29 is 100101
                 // this means he visited three places (London,LA,Rome)  
    vector<int> times; // will represent the visiting time,e.g. 1,2,5 means london 1 time, LA
                       // twice and Rome five times
};

map<string,vector<info> *> log;

人々はさまざまな都市から来ています。都市が存在するかどうかを確認します。新しい人物を に追加するだけです。そうでない場合はvector、新しいマップ オブジェクトを作成します。

vector<info> tp;
info tmp;
if(log.size()==0|| log.count(city)==0) //empty or not exist 
{
    tp.push_back(tmp);
    vector<info>* ss = new vector<info>;
    ss=&(tp);
    // create a new object 
    log.insert(map<string,vector<info> * >::value_type(city,ss)); // new object 
}
else // city exist, just add the information to the vector
{
    map<string,vector<info> *>::iterator t;
    t=log.find(city);
    *(t->second).push_back(tmp);  //the problem  in this line
}

新しい tmp をベクターに挿入するにはどうすればよいですか?

読み取る情報は次のとおりです。

Paris,Juli,5,3,6
Paris,John,24,2
Canberra,John,4,3
London,Mary,29,4,1,2
4

2 に答える 2

5

ここには多くの間違いがあり、それらはすべてポインターの誤用に起因しています。問題の原因として言及されている行は、構文上の軽微な問題です。もっと大きな問題が目の前にあります。

それらはすべて、ポインターを誤用しないことで簡単に解決できます。ここでポインターを使用する理由はないため、最終的な修正は、マップにこのタイプを持たせることmap<string,vector<info>> log;です。

次に、コードは次のようになります。

info tmp;
log[city].push_back(tmp);
// the [] operator creates a new empty vector if it doesn't exist yet
// there's no point in doing the checks by hand

簡単な解決策が得られたので、部屋のコードで象について言及します。

vector<info>* ss = new vector<info>;
ss=&(tp);
// ...
log.insert(map<string,vector<info> * >::value_type(city,ss));

この一連の操作は、動的ストレージ期間を持つベクトルを作成し、ただちにそれへの唯一のポインターを破棄します。これにより、作成されたばかりのベクトルが失われ、使用するメモリがリークされます。もう回復できません。

さらに悪いことssに、ローカル変数を指すように設定し、そのポインターをマップ内のローカル変数に保存します。ローカル変数には自動保存期間があるため、関数が戻ると消えます。これにより、マップに格納されたばかりのポインターが無効になります。これは、指すベクトルがなくなったためです。その後、あらゆる種類の大混乱が引き起こされるでしょう。

于 2012-10-17T08:46:08.553 に答える
0

このようにする必要があるようです

(t->second)->push_back(tmp);
于 2012-10-17T08:28:30.517 に答える