Совместное использование массива с векторами STL - PullRequest
2 голосов
/ 14 сентября 2011

Я бы хотел поделиться содержимым массива значений типа double a размера k с одним или несколькими векторами STL v1, v2 ... vn.

Эффект, который я хочу получить от этого общего хранилища, заключается в том, что если базовый массив будет изменен, можно наблюдать изменение по всем векторам, которые делятся своим содержимым с массивом.определив векторы v1 ... vn как векторы указателей

vector<double*> v1;

и скопируйте указатели a на a + k в этот вектор.Однако мне не нравится это решение.Я хочу, чтобы векторы были вектором двойников.

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

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

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

Нет, выне могу этого сделать.Контейнеры стандартной библиотеки всегда управляют своей собственной памятью.

Лучше всего создать std::vector<double>, а затем использовать его в качестве массива, где это необходимо (через &v[0], предполагая, что вектор не является-empty).

Если вы просто хотите иметь интерфейс контейнера, попробуйте использовать std::array (или boost::array или std::tr1::array) или написать собственный интерфейс контейнера для инкапсуляции массива.

1 голос
/ 14 сентября 2011

Это звучит так, будто вы хотите псевдоним массив с вектором. Таким образом, логически вам нужен вектор ссылок (который не работает по синтаксическим причинам). Если вам действительно нужна эта функция, вы можете написать свой собственный класс-оболочку ref, который ведет себя точно так же, как реальная ссылка на C ++, поэтому пользователи ваших vn векторов не смогут различить vector<T> и vector<ref<T> > (например, с T = double). Но внутренне вы могли бы связать элементы в векторах с элементами в вашем массиве «master».

Но вы должны были найти веские причины для этого цирка:)

1 голос
/ 14 сентября 2011

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

Когда вы разделяете оба (хранение элемента и перечисление элемента), как в вашем случае, вы можете рассмотреть boost.range .boost.range дает вам пару итераторов, которые определяют степень применения алгоритмов, и у вас есть фактическое хранилище памяти в вашем массиве.Это работает главным образом для доступа к ним для чтения, потому что обычно изменение структуры вектора делает недействительными итераторы.Вы можете воссоздать их, однако.

...