2013-07-30 2 views
1

Я довольно новичок в программировании на С ++ и имею некоторые проблемы.Сохранить std :: set in std :: list

У меня есть набор:

std::set<Proc*> finalProc = getFinalProc(); 

я просто хочу, чтобы скопировать все элементы из этого набора в список. Я думал, что мне нужно перебирать набор и сохранять элементы в списке? Я предполагаю, что я сделал большую ошибку, но я не могу найти решение для этого:

std::list<Proc*> firstLevel; 
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){ 
    firstLevel.push_back(????); 
} 

идеи была push_back всех итерированных элементов?

благодаря

+0

Вам был показан лучший способ сделать это, но только для полноты вы заменили бы '????' на '* it'. 'it' трактуется несколько как указатель, поэтому' * '" разделяет его и получает значение, которое затем будет помещено в 'list'. – BoBTFish

ответ

7

Существует гораздо лучший способ сделать это:

std::list<Proc*> firstLevel(finalProc.begin(), finalProc.end()); 

В исходном коде, вы должны быть заменены ???? с *it и endProcessors с finalProc

Как @ luk32 ноты, возможно, у вас есть ошибка (если вы хотите скопировать фактические данные, а не указатели). В этом случае вы можете увидеть @ luk32 решения или я бы пойти на std::unique_ptr здесь (смарт-указатели является предпочтительным способом для управления памятью в современных C++):

std::list<std::unique_ptr<Proc>> firstLevel; 
for(const auto& ptr: finalProc){ 
    firstLevel.push_back(std::make_unique<Proc>(*ptr)); 
} 

Всей память указываемых указателей в Firstlevel будет автоматически освобождена после выход из firstLevel видимость scope.

+1

так проклятый простой ... спасибо. какая неправильная идея с push_back от итератора? – user2633791

+0

Ничего страшного, но этот код короче. – Seagull

+1

Я вижу ошибку. Обратите внимание, что он хранит указатели на 'Proc'. Вы сделаете копии этих ссылок. Не уверен, что это предназначено. – luk32

1

Редактировать: Я знаю, после комментариев, что этот ответ не помогает OP, однако сначала это было неясно. Таким образом, я хотел бы оставить его, если кто-нибудь когда-либо приходил сюда и хотел, чтобы копировать фактические объекты. Просто ради полноты.

Если вы хотите сделать копии указателей на Proc, то объекты идут для ответа сашей.

Однако, если вы хотите сделать копии реальных объектов, хранящихся в наборе, вам необходимо их явно скопировать.

std::list<Proc*> firstLevel; 
for(std::set<Processor*>::iterator it = endProcessors.begin(); it != endProcessors.end(); ++it){ 
    firstLevel.push_back(new Proc(**it)); //1 
} 

[1] разыменования итератора, разыменования указателя, чтобы получить реальный объект, а затем создать новый объект Proc от него, и нажать на указатель из нового на список.

Я вижу уже downvotes, так что, возможно, я попытаюсь разработать.

Если вы копируете только ссылки - указатели. Затем изменение элементов в списке будет отражено на элементах набора, и наоборот, когда они хранят Proc*. Если намерение заключается в копировании фактических Proc объектов. Выложенный код делает это.

Редактировать: Чтобы отразить ваш комментарий.

Конечно, важно помнить, что когда вы храните указатели, когда контейнер уничтожается, его вызывал только его элемент get d'tors. В этом случае это будет Proc*. Я имею в виду, что только указатели будут потеряны. Если мы создаем явные копии элементов при создании вектора, конечно, нам нужно явно перебрать и использовать delete для каждого элемента, чтобы правильно освободить память.Альтернативой может быть использование интеллектуальных указателей, но исходный пример этого не сделал, поэтому я тоже оставил его.

+0

спасибо. копии указателей просто прекрасны. но я буду помнить об этом. спасибо – user2633791

+0

@sasha Ха-ха, хорошо, я полностью понимаю, но комментарий вроде бы был бы прекрасен. Тем не менее, та же проблема сохраняется, в вашем ответе, ее еще более опасной, я думаю, потому что элементы нужно удалять только один раз. Нужно заботиться о том, где это сделать. Особенно, если у вас есть несколько копий указателя на один и тот же элемент. – luk32

+0

@ luk32, в моем случае все в порядке, поскольку я делаю копию. И 'unique_ptr' автоматически удаляет его позже. –