powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массив
61 сообщений из 61, показаны все 3 страниц
Динамический массив
    #34352199
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, такой вопрос, нужна какя нибудь структура или динамический массив, которая удобно динамически добавляет
и удаляет элементы, но и одновременно предоставляет доступ к указателю на массив.

Посоветуйте что нибудь.
...
Рейтинг: 0 / 0
Динамический массив
    #34352261
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
std::vector
...
Рейтинг: 0 / 0
Динамический массив
    #34352272
Lexogen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
std::vector
тип последовательного контейнера, который используется в большинстве случаев;
std::list
используется, если нужно часто вставлять или удалять елементы в произвольной позиции;
std::deque
если большинство вставок или удалений производится в начале или конце.
...
Рейтинг: 0 / 0
Динамический массив
    #34352437
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчёт списка - неправда, потому как он не предоставляет доступ по индексу, в чём заключается основное свойство массива.
...
Рейтинг: 0 / 0
Динамический массив
    #34352926
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все это понятно, но
в конкретном случае , есть изменяющийся массив объектов ядра, который нужно подавать в функцию ожидания. если я использую например вектор, то как мне запихнуть его в эту функцию.

Код: plaintext
1.
2.
3.
4.
5.
HANDLE h[ 2 ];
h[ 0 ] = hAutoResetEvent1; // изначально занят
h[ 1 ] = hAutoResetEvent2; // изначально занят

WaitForMultipleObjects( 2 , h, TRUE, INFINITE);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
vector<HANDLE*> h;

h.push_back(&Event1);
h.push_back(&Event2);

h[ 0 ] = hAutoResetEvent1; // изначально занят
h[ 1 ] = hAutoResetEvent2; // изначально занят

WaitForMultipleObjects( 2 , h, TRUE, INFINITE);
...
Рейтинг: 0 / 0
Динамический массив
    #34353001
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так попробовать? (:
Код: plaintext
1.
2.
3.
4.
	std::deque<HANDLE> threads;
	threads.push_back(CreateThread(/*...*/));
	threads.push_back(CreateThread(/*...*/));
	WaitForMultipleObjects( 2 , (&threads.at( 0 )), TRUE, INFINITE);

или так?:
Код: plaintext
1.
2.
3.
4.
	std::vector<HANDLE> threads;
	threads.push_back(CreateThread(/*...*/));
	threads.push_back(CreateThread(/*...*/));
	WaitForMultipleObjects( 2 , &(*threads.begin()), TRUE, INFINITE);


судя по содержимому <vector>, оба варианта должны работать без ошибок.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//vector из MSVS2005

	reference at(size_type _Pos)
		{	// subscript mutable sequence with checking
		if (size() <= _Pos)
			_Xran();
		return (*(begin() + _Pos));
		}
...
Рейтинг: 0 / 0
Динамический массив
    #34353020
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только для std::vector есть гарантия непрерывного размещения элементов в памяти, следовательно валидным является вариант только c std::vector:

Код: plaintext
1.
2.
3.
std::vector<HANDLE> threads;
threads.push_back(CreateThread(/*...*/));
threads.push_back(CreateThread(/*...*/));
WaitForMultipleObjects( 2 , &threads[ 0 ], TRUE, INFINITE);

для std::deque нет такой гарантии.
...
Рейтинг: 0 / 0
Динамический массив
    #34353531
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большущее СПАСИБО!!!!)))
...
Рейтинг: 0 / 0
Динамический массив
    #34354118
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковТолько для std::vector есть гарантия непрерывного размещения элементов в памяти, следовательно валидным является вариант только c std::vector:
...

Гарантии на размер элемента массива нет. :)
...
Рейтинг: 0 / 0
Динамический массив
    #34354318
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhГарантии на размер элемента массива нет. :)

Это вы о чем? Я говорил о гарантии непрерывного размещения элементов в памяти. Где вы прочитали о размере элемента - не знаю.
...
Рейтинг: 0 / 0
Динамический массив
    #34354335
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков AkhГарантии на размер элемента массива нет. :)

Это вы о чем? Я говорил о гарантии непрерывного размещения элементов в памяти. Где вы прочитали о размере элемента - не знаю.

В выводе о валидности результата. В последующих версиях между элементами могут появиться и метаданные.
...
Рейтинг: 0 / 0
Динамический массив
    #34354378
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhВ выводе о валидности результата. В последующих версиях между элементами могут появиться и метаданные.

Бред. Пока это так и никто не собирается эту гарантию отменять. Или вы программируете исходя из того, что в будущем вся STL может быть отменена?
...
Рейтинг: 0 / 0
Динамический массив
    #34354483
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков AkhВ выводе о валидности результата. В последующих версиях между элементами могут появиться и метаданные.

Бред. Пока это так и никто не собирается эту гарантию отменять. Или вы программируете исходя из того, что в будущем вся STL может быть отменена?

Придется для вас разжевать. Приближенно выглядит так:

В векторе есть гарантия, что элементы массива размещены по порядку, но нет гарантии, что размер элемента массива равен размеру типа данных вектора. Или же вы программируете исходя из того :7, что в текущей реализации размер элемента массива в вектор раверн размеру заданных данных.

Думаю, что и того изложения вам будет не достаточно для понимания. Тогда объясню на пальцах:

Вот вы задали вектор HANDLE. Положили туда сто пятнадцать указателей. Вектор из разместил по очереди, но не гарантировал вам, что они идут плотную друг за другом; и оставил по 2 байта между ними для мета данных (ну, там типа, индексация, новые улучшения, т.д. и т.п.). Вы, наивно, предпологая, что данные идут вслед за другом, передали их в функцию, котороя предполагает, что ей дали указатель на массив HANDLE. Она не предполагала, что разработчик подсунет ей ссылку на элемент вектора. Первый элемент оказался правельноым, а вот второй получил в два наименее значимых байта метаданные, а остальные сдвинутыми. В итоге, второй HANDLE был испорчен. И это при том, что вектор гарантирует вам, что элементы будут распологаться по очереди.

Вы можете и это бредом посчитать, но знайте, что в данном случае вы испольуетете данные о которых не имеете полное представление в случае, когда знание полного представления необходимо. Советовать ничего вам не буду, но обращу ваше внимание, что объекты необходимо использовать по назначению, и нет смысла использовать их внутереннюю конкретную реализацию, там где от вас ждут простых вещей.
...
Рейтинг: 0 / 0
Динамический массив
    #34354531
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковТолько для std::vector есть гарантия непрерывного размещения элементов в памяти, следовательно валидным является вариант только c std::vector:

Код: plaintext
1.
2.
3.
std::vector<HANDLE> threads;
threads.push_back(CreateThread(/*...*/));
threads.push_back(CreateThread(/*...*/));
WaitForMultipleObjects( 2 , &threads[ 0 ], TRUE, INFINITE);

для std::deque нет такой гарантии.

Я бы такой гарантии не давал.

Есть гаранития коррекнтой работы operaror[] & iterator.
Которые, с свойю очередь, могут делает преобразования.
Вычисление адреса обьекта другими средствами могут быть опасны.

На реализацию Allocator нужно смотреть в каждом конкретном случае.
...
Рейтинг: 0 / 0
Динамический массив
    #34354691
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 onstat-

Посмотрите стандарт, чтобы убедится, что эта гарантия есть. То что вы ее не даете, согласитесь, мало кого волнует.

2 Akh

Спасибо за разжовывание, но по-моему вы так и не поняли, что значит последовательное размещение элементов в памяти - это такое размещение элементов при котором, адрес следующего элемента вычисляется как адрес текущего элемента + sizeof(тип элемента) - именно за счет этого операция индексации [] имеет сложность O(1).

Вы в следующий раз, чтобы вот так не позорится, всеже поднимите какой-нибудь материал.
...
Рейтинг: 0 / 0
Динамический массив
    #34354872
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковСпасибо за разжовывание, но по-моему вы так и не поняли, что значит последовательное размещение элементов в памяти - это такое размещение элементов при котором, адрес следующего элемента вычисляется как адрес текущего элемента + sizeof(тип элемента) - именно за счет этого операция индексации [] имеет сложность O(1).

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


Вы ошибаетесь, считая, что сложность по времени O(1) операции [] достигается только за счет размещения элементов непосредственно друг за другом.

Специально для вас поднял материал:
Язык программирования С++. Специальное издание. Бьерн Страуструп. 17.1.3
Стандарт не предписывает специального представления для каждого стандартного контейнера.

Или вы будете и дальше спорить? ;)
...
Рейтинг: 0 / 0
Динамический массив
    #34354900
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С чем спорить, с вашим невежеством? Пожалуй воздержусь. А вот на счет гарантии непрерывностого размещения элементов в std::vector буду:

автор23.2.4 Class template vector
1 A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized)
constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage
management is handled automatically, though hints can be given to improve efficiency. The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
...
Рейтинг: 0 / 0
Динамический массив
    #34354934
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковС чем спорить, с вашим невежеством? Пожалуй воздержусь. А вот на счет гарантии непрерывностого размещения элементов в std::vector буду:

автор23.2.4 Class template vector
1 A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized)
constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage
management is handled automatically, though hints can be given to improve efficiency. The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

Ну, и что вы думаете я на это отвечу? Сейчас тоже насочиняю, номер припишу и выложу.
...
Рейтинг: 0 / 0
Динамический массив
    #34354951
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это цитата из стандарта. Я вам уже давал линк на стандарт, то что вы неудосужились его открыть - это ваша проблема. На этом я заканчиваю дискутировать с вами. Пишите как хотите, но не сбивайте с толку людей своим ИМХО.
...
Рейтинг: 0 / 0
Динамический массив
    #34354975
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков2 onstat-

Посмотрите стандарт, чтобы убедится, что эта гарантия есть. То что вы ее не даете, согласитесь, мало кого волнует.



Точной гарантии я ненашел, зато в первом же абзаце :

23.2.4 Template class vector
A vector is kind of sequence that supports random access iterators. In addition, it supports amortized constant time insert and erase operations at the end. Insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency.

То что дальше там написано о количестве вызовов и реалокаций
однозначно не говорит о том что данные распологаются неприрывно.
Учитывая что размер вектора теоретически неограничен.

Если не тяжело , приведите цитату подтверждающую гарантию непрерывного выделение памяти для вектора.

Мне самому интересно найти это место.
...
Рейтинг: 0 / 0
Динамический массив
    #34355002
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков

автор23.2.4 Class template vector
The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

В моем тексе (first edition 1998-09-01 ) этого нет.
...
Рейтинг: 0 / 0
Динамический массив
    #34355014
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этого
автор
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().


Прошу прощения.

з.ыю почему нельзя редактировать сообщения?
...
Рейтинг: 0 / 0
Динамический массив
    #34355232
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков2 onstat-

Посмотрите стандарт, чтобы убедится, что эта гарантия есть. То что вы ее не даете, согласитесь, мало кого волнует.



Сейчас это в первую очередь волнует меня.

Какая у Вас версия ?

У меня :

ISO/IEC 14882 first edition 1998-09-01
Date of ANSI Аpproval: 7/27/98
Reference number: ISO/IEC 14882:1998(E)
...
Рейтинг: 0 / 0
Динамический массив
    #34355240
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вам отправил на указанный вами в профиле почтовый ящик стандарт 2003 года.
...
Рейтинг: 0 / 0
Динамический массив
    #34355260
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЭто цитата из стандарта. Я вам уже давал линк на стандарт, то что вы неудосужились его открыть - это ваша проблема. На этом я заканчиваю дискутировать с вами. Пишите как хотите, но не сбивайте с толку людей своим ИМХО .

то алл:

Попонтаваться и убежать - не считаю положительной чертой образованного человека.
...
Рейтинг: 0 / 0
Динамический массив
    #34355282
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Akh

Вы не привели ни одного аргумента, а лишь свое личное мнение. В каком направлении вы хотите продолжить беседу? А что касается понта, то вам необходимо разобраться в себе для начала, прежде чем награждать других своими качествами.
...
Рейтинг: 0 / 0
Динамический массив
    #34355334
Ну чтобы господам лучше спорилось приведу цитату из лучшей книги по STL: Николая Джосьютиса " Стандартная библиотека C++ "

Николай Джосьютис
Векторы как обычные массивы
В спецификации стандартной библиотеки C++ не сказано, что элементы вектора должны храниться в непрерывном блоке памяти. Тем не менее подразумевалось, что такая реализация гарантирована, а соответствующие изменения будут внесены в спецификацию. Следовательно, для любого действительного индекса i в векторе v заведомо истинно следующее условие:
&v == &v[0] + i
Из гарантированного выполнения этого условия следует один важный факт: вектор может задействоваться во всех случаях, когда в программе используется динамический массив. Например, в векторе можно хранить данные обычных строк С типа char* или const char*:
std: :vector<char> v: // Создание вектора как динамического массива типа char
v.resize(41); // Выделить память для 41 символа (включая \0)
strcpy(Sv[0]. "hello, world"): // Копирование строки С в вектор
printf("£s\n", &v[0]): // Вывод содержимого вектора в виде строки С
...
Рейтинг: 0 / 0
Динамический массив
    #34355344
что-то эта строка выше полохо пропечаталась, исправил:
&v == &v[0] + i
...
Рейтинг: 0 / 0
Динамический массив
    #34355359
нифига себе квадратные скобки не воспринимает( [] внутри i ), думает что я курсивом писать хочу. попробую так
Код: plaintext
1.
&v[j] == &v[ 0 ] + j;
...
Рейтинг: 0 / 0
Динамический массив
    #34355380
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковВы не привели ни одного аргумента, а лишь свое личное мнение.

Ложь

Анатолий ШироковА что касается понта, то вам необходимо разобраться в себе для начала, прежде чем награждать других своими качествами.

Провокация.
...
Рейтинг: 0 / 0
Динамический массив
    #34355451
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вы еще подеритесь!
А на самом деле я видел несколько реализаций STL, и у всех ноги растут из Степанова и Ли и ниразу еще запихивание &array[0], в функцию ожидающую в качестве параметра укзатель на массив не приводило ни к чему плохому
...
Рейтинг: 0 / 0
Динамический массив
    #34355494
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местный писатель_Ну чтобы господам лучше спорилось приведу цитату из лучшей книги по STL: Николая Джосьютиса " Стандартная библиотека C++ "

Николай Джосьютис
Векторы как обычные массивы
В спецификации стандартной библиотеки C++ не сказано, что элементы вектора должны храниться в непрерывном блоке памяти. Тем не менее подразумевалось, что такая реализация гарантирована, а соответствующие изменения будут внесены в спецификацию. Следовательно, для любого действительного индекса i в векторе v заведомо истинно следующее условие:
&v == &v[0] + i
Из гарантированного выполнения этого условия следует один важный факт: вектор может задействоваться во всех случаях, когда в программе используется динамический массив. Например, в векторе можно хранить данные обычных строк С типа char* или const char*:
std: :vector<char> v: // Создание вектора как динамического массива типа char
v.resize(41); // Выделить память для 41 символа (включая \0)
strcpy(Sv[0]. "hello, world"): // Копирование строки С в вектор
printf("£s\n", &v[0]): // Вывод содержимого вектора в виде строки С


В электронном виде гдето еть?
Можно ссылку.

Пока я ожидаю новый стандарт( не получил еще) немного пофилосовствую.
Все последующее в этом сообщенни воспринимать как ИМХО.
Без претензии на абсолютную правоту.

Как говрит наш президент

Теза перша:

1. Для каждого шаблона может существовать свой ( непосредственно написанный под него)
Allocator.
Если для строк непрерывное хранение критично то для массивов чисел нет.
У меня давно уже руки чешутся написать алокатор для хранения больших массивов
в разделяемой памяти Unix. Да все руки недоходят.
Я не хочу для добавления одного элемента ганять по памяти сотни мегабайт.

Теза друга:

2. Когдато (сейчас уже не помю где ) кажется у Страуструпа читал, что скорость вставки
в вектор соответствует закону logN ( N количество элементов).
Вы можете представить себе реалокацию массива обьемом в 1 Гб ?
Если есть требования стандарта на непрерывное хранине значит должно быть
описание как быть с памятью во время копирования.
Те кто повелся на рекламу об относительно малой разницы в скорости между
вектором и массивом будут сильно разочарованы.


Теза третя:
Я бы на месте стандартизаторов никода бы на абсолютную непрервность не завязывался,
а лучше рассмотрел возможность предоставить виртуально непреревное простраство с точки зрения доступа к обьектам класса и описал соответсвующие механизмы
(которые частично уже есть).

Кстате по поводу

Код: plaintext
1.
&v[j] == &v[ 0 ] + j;

Этот результат может быть получен в результате
Код: plaintext
1.
operator[]+(int)
Который зделает всю черную работу.
Я бы с большим удовольствием увидел бы такой оператор в стандарте нежели
требование размещать данные строго последовательно.


ИМХО Хранить элементы вектора непрерывно - тупиковый путь .
...
Рейтинг: 0 / 0
Динамический массив
    #34355526
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Akh

Опять ниодного аргумента. Одни вопли.
...
Рейтинг: 0 / 0
Динамический массив
    #34355533
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Местный писатель

Джосьютис лишь цитирует стандарт, цитату я приводил ранее.
...
Рейтинг: 0 / 0
Динамический массив
    #34355547
onstat-

В электронном виде гдето еть?
Можно ссылку.



на странице 164 посмотри
...
Рейтинг: 0 / 0
Динамический массив
    #34355559
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковОпять ниодного аргумента. Одни вопли.

Прочти топик.
...
Рейтинг: 0 / 0
Динамический массив
    #34355572
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Akh

Я не понимаю, в чем вы меня хотите убедить, что между двумями элементами std::vector может быть "дырки"? Это не так. В чем еще?
...
Рейтинг: 0 / 0
Динамический массив
    #34355582
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedНу вы еще подеритесь!
А на самом деле я видел несколько реализаций STL, и у всех ноги растут из Степанова и Ли и ниразу еще запихивание &array[0], в функцию ожидающую в качестве параметра укзатель на массив не приводило ни к чему плохому

blinded, осталось дождаться реализации, когда приведет к плохому...

Считаю, что подобное использование не является идеологически верным. Т.к. есть специальный интерфейс, который предоствляет доступ к определенным элементам контейнера, а не ко всему контейнеру в целом. Так как область применения контейнера не влючает использование его элементов в целом, то использование не по назначению, не может являться корректным.
...
Рейтинг: 0 / 0
Динамический массив
    #34355597
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где криминал

авторint foo(boo array[], size_t size)
{
...
}

...

std::vector<boo> array(10);
foo(&array[0], array.size());

?
...
Рейтинг: 0 / 0
Динамический массив
    #34355599
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЯ не понимаю, в чем вы меня хотите убедить, что между двумями элементами std::vector может быть "дырки"? Это не так. В чем еще?

Уже не буду спрашивать "где ваши аргументы" по этому конкретному вопросу.

Дырки - это только одно из предположений. Прочтите ответ к blinded.

ПС:
Вопрос не по теме: вы специально делаете наивный вид, что не понимаете мои высказываения, преследуя определенную целью, или просто не внимательно читаете? Вопрос относится не только к этому ответу, а практически ко всем в этом топике.
...
Рейтинг: 0 / 0
Динамический массив
    #34355640
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Akh

Я просто не могу понять, что вы пытаетесь донести. Еще раз говорю, то что вы думаете или считаете - это все лишь, то что вы думаете или считаете. До сих пор вы не привели доказательства того, что между элементами могут быть дырки, значит не пожете подтвердить свои домыслы, следовательно ведете разговор без аргументов. Поэтому я не могу принять вашего "идеологически не верно". В чем не верно?

По поводу моих аргументов -я, вроде, уже привел ссылку на стандарт. Или для вас это не аргумент.
...
Рейтинг: 0 / 0
Динамический массив
    #34355653
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковА где криминал?




авторint foo(boo array[], size_t size)
{
.......
memset (&array[0], 0, size); // с обычными мссивами делаю, а с веторами я не рискую.
.......

}




Что будет если где нибудь при сборке попадется не та реализация STL?
И на каком эта бомба взорвется.
...
Рейтинг: 0 / 0
Динамический массив
    #34355666
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз говорю, что мы сейчас говорим не о реализации, а о стандарте. Следовательно, если реализация не удовлетворяет требованиям стандарта она не вправе носить название STANDARD TEMPLATE LIBRARY. Стандарт это единственный документ, которым должен руководствоваться разработчик. Ньюансы есть, но в фундаментальных вещах разногласий быть не должно.
...
Рейтинг: 0 / 0
Динамический массив
    #34355709
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЕще раз говорю, что мы сейчас говорим не о реализации, а о стандарте. Следовательно, если реализация не удовлетворяет требованиям стандарта она не вправе носить название STANDARD TEMPLATE LIBRARY. Стандарт это единственный документ, которым должен руководствоваться разработчик. Ньюансы есть, но в фундаментальных вещах разногласий быть не должно.

В принципе согласен.

Но есть ИМХО : Но непрерывность памяти это насколько не фундаментальная вещь
что заносить ее в стандарт планформонезависимого языка по крайней мере недальневидно.
Со стандартом я спорить ненамерен, есть много законов которые мне не нравятся, но я вынужден им подчиняться.
...
Рейтинг: 0 / 0
Динамический массив
    #34355733
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понимаете, разработчки std::vector должны были гарантировать непрерывное размещение, дабы иметь динамический аналог втроенного массива. В противном случае, нам бы пришлось пользоваться небезопасными динамическими массивами в стиле new POINT[] только лишь для того, чтобы передать в WinAPI функцию набор точек и прочее-прочее.
...
Рейтинг: 0 / 0
Динамический массив
    #34355746
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков2 Akh

Я просто не могу понять, что вы пытаетесь донести. Еще раз говорю, то что вы думаете или считаете - это все лишь, то что вы думаете или считаете. До сих пор вы не привели доказательства того, что между элементами могут быть дырки, значит не пожете подтвердить свои домыслы, следовательно ведете разговор без аргументов. Поэтому я не могу принять вашего "идеологически не верно". В чем не верно?

По поводу моих аргументов -я, вроде, уже привел ссылку на стандарт. Или для вас это не аргумент.

На счет дырок я привел пример возможной реализации.

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

Рассмотрим идеалогию контейнера вектор, как я ее понимаю. Если вы будете в чем-то не согласны - поправляйте, если хотите. Только без личностных нападок (плохое впечатление о вас складывается).

Так вот. Имеем шаблон контейнера, который может содержать объекты. Назовем его вектором и возложим на него требование - максимально быстро пробегать по элементам. Для этого у контейнера есть итератор и интерфейс доступа к элементам. Он выполняет свою функцию, все работает, все прекрасно.

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

В итоге, мы используем, причем успешно, данные контейнера вектор, как массив и все хорошо. Ничего не происходит, т.к. реализации идут параллельно нашим размышлениям.

Но остался не верный вывод. То что очевидно ложить данные друг за другом еще не значит, что они так лежат. Может между ними дырки (допустим, 4 байта интеджер, 2 байта метаданные, и т.д. v[n]=(type of element vector)((char*)(&v[0])+(sizeof(v[0])+C)*n)) или вариант от onstat-а или мало ли чего можно еще надумать. А раз так, значит наш код находится под угрозой, и следавательно он не может считаться корректным.

Надеюсь, понятно изложил, что я считаю в данном случаю идеологией.
...
Рейтинг: 0 / 0
Динамический массив
    #34355821
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я считаю, что вы неверно трактуете термин contiguously из приведенной цитаты
Код: plaintext
1.
2.
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator>
where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for 
all 0 <= n < v.size().
и заменяете его на "друг за другом", хотя истинный смысл его "рядом"

Далее, если даже не обращать внимание на это замечание, то v\[i\] согласно стандарту, определенный как:

Код: plaintext
1.
reference operator[](size_type n);
const_reference operator[](size_type n) const;

возвращает reference, который определен как

Код: plaintext
typedef typename Allocator::reference reference;

который, согласно стандарту, определен как

Код: plaintext
1.
X::reference == T&

Следовательно в приведенной цитате v[0] может означать лишь ссылку на 0 элемент типа T, а v[n] - ссылку на n-ый элемент типа T. Следовательно, sizeof(v ) == sizeof(v[i+1]) == sizeof(T) и значит С в вашем посте всегда будет равно 0:

С = sizeof(v[i+1]) - sizeof(v) = 0

На основе этого можно сделать вывод, что элементы находятся в векторе непрерывно без дырок и там где используются обычные массивы мы в праве использовать и std::vector.
...
Рейтинг: 0 / 0
Динамический массив
    #34355893
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЯ считаю, что вы неверно трактуете термин contiguously из приведенной цитаты
Код: plaintext
1.
2.
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator>
where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for 
all 0 <= n < v.size().
и заменяете его на "друг за другом", хотя истинный смысл его "рядом"

Далее, если даже не обращать внимание на это замечание, то v\[i\] согласно стандарту, определенный как:

Код: plaintext
1.
reference operator[](size_type n);
const_reference operator[](size_type n) const;

возвращает reference , который определен как

Код: plaintext
typedef typename Allocator::reference reference;

который, согласно стандарту, определен как

Код: plaintext
1.
X::reference == T&

Следовательно в приведенной цитате v[0] может означать лишь ссылку на 0 элемент типа T, а v[n] - ссылку на n-ый элемент типа T. Следовательно, sizeof(v ) == sizeof(v[i+1]) == sizeof(T) и значит С в вашем посте всегда будет равно 0:

С = sizeof(v[i+1]) - sizeof(v) = 0

На основе этого можно сделать вывод, что элементы находятся в векторе непрерывно без дырок и там где используются обычные массивы мы в праве использовать и std::vector.



Не буду претендовать а абсолютную правоту, так как не уверен.

Мне кажется я об этом уже писал своими словами.
Тонкое место в ваших рассуждениях выделено.
Возвращает не значит, что попутно не делает никаких преобразований.
Мне очень не нравится слово obeys в контексте рассуждений.
...
Рейтинг: 0 / 0
Динамический массив
    #34356053
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь достаточно того, что какие бы это преобразования ни были верно следующее:

&v[n] = &v[0] + n = ((const char *)&v[0]) + n*sizeof(T);

поскольку именно так определяется оператор + применительно к указателю на тип, где v[0] и v[n] - ссылки на T.
...
Рейтинг: 0 / 0
Динамический массив
    #34356083
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО:
Если не нравится <vector>, то можно:
1) Залезть в исходники и посмотреть как оно работает.
2) Использовать класс типа этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
template <typename T, typename Int = unsigned long>class Vector{
public:
	Int increment;
	Int count;
	Int capacity;
	T* data;

	void grow(void){
		Int newCapacity = increment ? capacity + increment: capacity* 2 ;
		T* newData = new T[newCapacity];
		memcpy(newData, data, sizeof(T)*count);
		delete[] data;
		data = newData;
		capacity = newCapacity;
	}

	void pushBack(const T value){
		if (count == capacity)
			grow();
		data[count++] = value;
	}

	void pushRefBack(const T& value){
		if (count == capacity)
			grow();
		data[count++] = value;
	}

	void clear(void){
		count =  0 ;
	}

	Vector(Int _capacity =  16 , Int _increment =  0 ){
		count =  0 ;
		capacity = _capacity ? _capacity:  16 ;
		increment = _increment;
		data = new T[capacity];
	}

	virtual ~Vector(void){
		delete[] data;
	}
};


2 Анатолий Широков
Можно ссылочку на стандарт или хотя бы его код (по которому его можно найти)?
...
Рейтинг: 0 / 0
Динамический массив
    #34356093
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел код текущего стандарта (http://en.wikipedia.org/wiki/C%2B%2B):
[quote wiki]
The C++ programming language standard was ratified in 1998 as ISO/IEC 14882:1998, the current version of which is the 2003 version, ISO/IEC 14882:2003. A new version of the standard (known informally as C++0x) is being developed.
[/quote]
Возможно, там же есть и ссылки (просто не рыл)
...
Рейтинг: 0 / 0
Динамический массив
    #34356094
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Динамический массив
    #34356109
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:

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

Да как ты все не допрешь-то, vector именно такое использование всегда
и подразумевал. Именно как КОНТЕЙНЕРА В ЦЕЛОМ !!
О чем тебе и говорят уже долго.

Если завел нужное тебе capacity заранее, и не вызываешь функций,
которые могут привести к реаллокации памяти, а они строго оговорены,
то можешь использовать нутро vector как С-шний массив.
Нпример, можно выполнить сортировку вектора С-шным qsort().

Если в типе T есть выравнивание, то оно ВХОДИТ в sizeof(T) и
все хорошо, и в С, и в С++.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Динамический массив
    #34356155
EtLIN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий Широков абсолютно прав.
Не понимаю зачем вообще спорить, только ради спора..
...
Рейтинг: 0 / 0
Динамический массив
    #34356601
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно. Я пытался объяснить свою точку зрения, походу не вышло. Объснять другими словами, вижу нет смысла. Раз в данном случае это теоритический вопрос, думаю, можно на этом остановиться.
...
Рейтинг: 0 / 0
Динамический массив
    #34356602
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EtLINАнатолий Широков абсолютно прав.
Не понимаю зачем вообще спорить, только ради спора..

Не имею привычки
...
Рейтинг: 0 / 0
Динамический массив
    #34356610
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЯ считаю, что вы неверно трактуете термин contiguously из приведенной цитаты
Код: plaintext
1.
2.
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator>
where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for 
all 0 <= n < v.size().
и заменяете его на "друг за другом", хотя истинный смысл его "рядом"

Далее, если даже не обращать внимание на это замечание, то v\[i\] согласно стандарту, определенный как:

Код: plaintext
1.
reference operator[](size_type n);
const_reference operator[](size_type n) const;

возвращает reference, который определен как

Код: plaintext
typedef typename Allocator::reference reference;

который, согласно стандарту, определен как

Код: plaintext
1.
X::reference == T&

Следовательно в приведенной цитате v[0] может означать лишь ссылку на 0 элемент типа T, а v[n] - ссылку на n-ый элемент типа T. Следовательно, sizeof(v ) == sizeof(v[i+1]) == sizeof(T) и значит С в вашем посте всегда будет равно 0:

С = sizeof(v[i+1]) - sizeof(v) = 0

На основе этого можно сделать вывод, что элементы находятся в векторе непрерывно без дырок и там где используются обычные массивы мы в праве использовать и std::vector.


Тут я оканчательно понимаю, что мы друг друга не слышим. И нет смысла этого добиваться.
...
Рейтинг: 0 / 0
Динамический массив
    #34356641
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковЗдесь достаточно того, что какие бы это преобразования ни были верно следующее:

&v[n] = &v[0] + n = ((const char *)&v[0]) + n*sizeof(T);

поскольку именно так определяется оператор + применительно к указателю на тип, где v[0] и v[n] - ссылки на T.


Такую формулировку можно рассматривать как виртуално непрерывное простраство,
что абсолютно не значит что:

Анатолий Широков
Только для std::vector есть гарантия непрерывного размещения элементов в памяти


Думаю на этом можно закончить обсуждение, так как в стандарте это однозначно не определено.
...
Рейтинг: 0 / 0
Динамический массив
    #34357017
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Такую формулировку можно рассматривать как виртуално непрерывное простраство,
что абсолютно не значит что:


Только не надо придумывать свою собственную терминологию. Непрерывность гарантируется стандартом и я уже устал это доказывать:

&v[n] == &v[0] + n for
all 0 <= n < v.size().

Ваши доводы относительно неоднозначности стандарта в этом вопросе не выдерживают никакой критики.
...
Рейтинг: 0 / 0
Динамический массив
    #34357269
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
Непрерывность гарантируется стандартом и я уже устал это доказывать:


моежете уже не доказывать.

Вы упустили :
автор
гарантия непрерывного размещения элементов в памяти


Будьте последовательны это очень важно в контесте разговора.
Доказывать нужно было только эту фразу.


Анатолий Широков

&v[n] == &v[0] + n for
all 0 <= n < v.size().



С этим я спорить ненамерен, потому, что тут все правильно.

Анатолий Широков

Ваши доводы относительно неоднозначности стандарта в этом вопросе не выдерживают никакой критики.


Я не утверждал, что он неоднозначен.
И критики тоже невидел.
...
Рейтинг: 0 / 0
Динамический массив
    #34357448
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 onstat-

авторДоказывать нужно было только эту фразу.

гарантия непрерывного размещения элементов в памяти std::vector это и есть

&v[n] == &v[0] + n for
all 0 <= n < v.size().

То с чем вы уже и не спорите.

Все, извините, вы гоняете уже из пустого в порожнее. Ну как так можно?
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]