Ссылка на подмножество объекта контейнера - PullRequest
3 голосов
/ 21 декабря 2010

У меня есть быстрый вопрос о наличии ссылки на подмножество коллекции. Считайте, что у меня есть вектор объектов. Теперь я хочу создать еще один вектор, который является подмножеством этого вектора, и я не хочу создавать копию подмножества объектов.

Один из способов, о котором я думал, - это создание vector<auto_ptr<MyClass> >. Это хороший подход? Пожалуйста, предложите, если вы думаете, что другие контейнеры, идиомы или шаблоны могут помочь в этом случае. Спасибо

Ответы [ 4 ]

7 голосов
/ 21 декабря 2010

Нет! См .: Почему неправильно использовать std :: auto_ptr <> с контейнерами STL?

Теперь, в качестве альтернативы, вы можете сохранитьсырые указатели или boost::shared_ptr в зависимости от ваших потребностей.

2 голосов
/ 21 декабря 2010

Другим, возможно, более подходящим для STL способом было бы просто иметь один вектор, но отслеживать поддиапазоны, используя пары итераторов (обратите внимание, что все алгоритмы используют итераторы именно по этой причине)

0 голосов
/ 02 марта 2016

Если подраздел является смежным, вы можете ссылаться на подраздел, используя итератор и счетчик, указывающий, сколько элементов вы ссылаетесь.

Разумный способ сделать это - создать некий шаблонный класс, который вы могли бы создать с помощью ссылки на контейнер и двух индексов, и позволить этому классу выполнять все границы и проверять ошибки, хотя я не уверен, как вы я мог бы сказать, существовал ли нижележащий контейнер в более позднее время ...

0 голосов
/ 21 декабря 2010

Вы можете использовать вектор индексов: vector<int> (или vector<size_t>, если хотите быть педантичным). Это лучше, чем хранить указатели (указатели в общем смысле: необработанные указатели C / C ++, shared_ptr, iterator и т. Д.) , если содержащий вектор не является постоянным .

Рассмотрим следующий сценарий: «большой» вектор содержит яблоко, апельсин и лимон, а «маленький» вектор содержит указатель на яблоко. Если вы добавите кучу других фруктов к большому вектору, STL собирается перераспределить память для вектора, поэтому указатель на яблоко будет недействительным (указывает на освобожденную память).

Если описанный выше сценарий возможен, используйте вектор индексов. Если это невозможно, используйте другие методы (например, вектор необработанных указателей или вектор копий объектов).

...