Совместное использование массива с векторами STL

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

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

Я могу сделать это, определив векторы _6 _..._ 7_ как векторы указателей.

vector<double*> v1;

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

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


person san    schedule 13.09.2011    source источник
comment
Говоря о совместном использовании, вы имеете в виду, что v должны иметь отличную идентичность, потому что они будут каким-то образом выполнять отдельные обязанности (возможно, имея другие значения в [l > k]? Есть ли какая-то причина, по которой вы не можете сделать a вектором, а v тоже ссылается на него?   -  person dmckee --- ex-moderator kitten    schedule 14.09.2011
comment
Связанные и, возможно, повторяющиеся: Преобразование между C ++ std :: vector и C array без копирования, хотя ответ на эту часть вопроса находится в комментарии к принятому ответу на этот вопрос.   -  person James McNellis    schedule 14.09.2011
comment
@dmckee Я хочу, чтобы при изменении элемента массива все соответствующие элементы векторов также были изменены.   -  person san    schedule 14.09.2011
comment
Кстати - до сих пор вы говорили нам, как, по вашему мнению, должна работать реализация, но не о том, что вы хотите делать. Мотивация может позволить нам предложить другой подход.   -  person dmckee --- ex-moderator kitten    schedule 14.09.2011
comment
@dmckee У меня есть рабочая реализация класса с таким псевдонимом хранилища на основе массивов. Я надеялся, что у меня будет другая реализация, в которой каждый объект хранит ссылку на вектор (в отличие от массива). Конструктор исходной реализации принимает массив в качестве входных данных, я пытался сохранить входную сигнатуру для реализации на основе вектора. Чего я надеялся достичь с помощью векторной реализации, так это возможности резервирования и изменения размера, а также возможности дешево обмениваться данными с помощью подкачки.   -  person san    schedule 14.09.2011
comment
@dmckee Однако я понимаю, что даже если бы можно было дать векторный вид массива, это не решило бы мою исходную проблему.   -  person san    schedule 14.09.2011


Ответы (4)


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

Но у вас должны были быть веские причины, чтобы устроить этот воздушный цирк :)

person bitmask    schedule 13.09.2011

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

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

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

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

person James McNellis    schedule 13.09.2011
comment
Думаю, я недостаточно ясно объяснил. Я хочу пойти в обратном направлении. Не отображать существующий вектор в виде массива, а предоставлять векторное представление существующего массива. Спасибо за исправление, то, что я имел в виду при извлечении, возвращало &v[0] - person san; 14.09.2011
comment
Правильно. Вы не можете этого сделать. Я говорю, что ваш лучший вариант - попытаться отменить его, чтобы vector владел данными, и, если это невозможно, написать свой собственный интерфейс контейнера. - person James McNellis; 14.09.2011

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

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

person Diego Sevilla    schedule 13.09.2011
comment
Это не совсем то, что мне здесь нужно, но голосование за информацию. Я уверен, что найду ему применение в другом месте. - person san; 14.09.2011

Чтобы ответить на ваш вопрос, насколько я знаю, std :: vector нельзя использовать для уже построенного массива. Я даже не могу подумать, как это можно сделать, поскольку есть также переменные, связанные с размером / емкостью. Вы можете попытаться взломать способ сделать это с помощью специального распределителя, но я считаю, что это будет некрасиво, подвержено ошибкам и не будет интуитивно понятным для будущего обслуживания.

Тем не менее, если я могу немного перефразировать ваши слова, вы запрашиваете несколько ссылок на один и тот же std :: vector. Я бы либо сделал именно это, либо подумал об использовании shared_ptr для вектора.

person pattakosn    schedule 10.07.2020