1

我想使用指针将新元素插入 avector我有以下示例代码:

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;

Peaple 来自不同的城市,我将检查该城市是否存在,只需将新人添加到 中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 回答