C ++ Совместное использование элементов в boost :: ptr_container? - PullRequest
1 голос
/ 17 июня 2011

Пожалуйста, рассмотрите следующий фрагмент кода:

int main()
{
    typedef boost::ptr_vector<int> ptr_vector;

    ptr_vector vec0;
    vec0.push_back(new int(1));
    vec0.push_back(new int(2));
    vec0.push_back(new int(3));
    vec0.push_back(new int(4));
    vec0.push_back(new int(5));

    ptr_vector::iterator last  = boost::prior(vec0.end()),
                         first = boost::prior(last, 3);

    ptr_vector vec1(first, last); // this will copy '2, 3, 4' to vec1

    struct print
    {
        void operator()(int const& i) {
            std::cout << i.m_i << std::endl;
        }
    };

    std::for_each(vec0.begin(), vec0.end(), print());   // 1, 2, 3, 4, 5
    std::for_each(vec1.begin(), vec1.end(), print());   // 2, 3, 4

    return 0;
}

Я не хочу copy элементы в vec1, но разделяю так, как обеспечивает shared_ptr<>.Мои требования в основном таковы:

  • Совместное использование одних и тех же экземпляров диапазона объектов, являющихся частью контейнера, в другом экземпляре контейнера
  • Не хочу использовать один экземпляр вбольше, чем эти два контейнера
  • Хотите получать уведомления, когда один элемент «внезапно» удаляется из другого контейнера (или, по крайней мере, получить отметку, например, что-то вроде shared_ptr::unique())

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

Нужно ли вместо этого использовать std::vector<> из shared_ptr<> или есть какое-то другое решение?

1 Ответ

3 голосов
/ 17 июня 2011

Да, вам следует использовать vector<shared_ptr<int>>.

Поскольку вы работаете только с диапазонами, вы можете составить собственное решение, которое отслеживает диапазоны и их пересечения (для реализации unique.) Затем вы можете хранить все в векторе и иметь индекс диапазонов.Вероятно, это будет быстрее (только из-за избежания пропусков кэша), но для его реализации потребуется больше усилий.

...