Я хочу вставить новый элемент в 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;
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
Здесь много ошибок, и все они происходят из-за неправильного использования указателей. Строка, которая упоминается как причина проблемы, является незначительной синтаксической проблемой. Есть большие проблемы под рукой.
Все они могут быть легко решены без неправильного использования указателей. Здесь нет причин использовать указатели, поэтому окончательное решение состоит в том, чтобы карта имела такой тип 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
чтобы указать на локальную переменную, а затем сохраняет этот указатель на локальную переменную на карте. Поскольку локальная переменная имеет автоматическую продолжительность хранения, она исчезает после возврата из функции. Это делает указатель, который был только что сохранен на карте, недопустимым, потому что у него больше нет вектора для указания. После этого будут разрушены все виды хаоса.
Похоже, тебе нужно сделать вот так
(t->second)->push_back(tmp);