Замена для вектора, принимающего нестандартные конструируемые и не присваиваемые типы - PullRequest
3 голосов
/ 16 декабря 2009

У меня есть класс test, который не является стандартным или назначаемым по определенным причинам. Однако он является копируемым - он может говорить, что ведет себя немного как ссылка.

К сожалению, мне понадобился динамический массив этих элементов, и я понял, что vector<test> - неправильный выбор, потому что элементы вектора должны быть стандартно конструируемыми и назначаемыми. К счастью, я справился с этой проблемой

  • с использованием vector<T>::reserve и vector<T>::push_back вместо vector<T>::resize и прямым заполнением записей (без стандартной конструкции)
  • трюк copy'n'swap для присваивания и тот факт, что vector обычно реализуется с использованием Pimpl-идиомы (нет прямого присваивания существующего элемента test), т.е.

    class base {
    private:
        std::vector<test> vect;
        /* ... */
    public:
        /* ... */
        base& operator= (base y) {
            swap(y);
            return *this;
        }
        void swap(base& y) {
            using std::swap;
            swap(vect, y.vect);
        }
       /* ... */
    };
    

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

Теперь, что дальше? Как я могу получить динамический массив из test объектов?

Примечание: Я должен предпочесть встроенные решения и классы, предусмотренные стандартом C ++.

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

(*) Мой класс test предоставил оператор присваивания, но этот работал как присвоение ссылки.

Ответы [ 4 ]

3 голосов
/ 16 декабря 2009

Рассмотрите возможность использования Boost's ptr_vector , входящего в состав библиотеки Boost Pointer Container. Смотрите, в частности, преимущество № 3 в мотивации этой библиотеки .

0 голосов
/ 16 декабря 2009

Как насчет использования вектора указателей?

0 голосов
/ 16 декабря 2009

Возможно, вы захотите взглянуть на Boost.Intrusive - хотя это будет означать, что вам нужно будет изменить тип test и где в памяти вы помещаете экземпляры test.

0 голосов
/ 16 декабря 2009

Напишите свой собственный класс динамического массива. Похоже, меньше работы, чем пытаться заставить STL работать с этим странным типом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...