Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамический массив / 25 сообщений из 61, страница 1 из 3
23.02.2007, 17:20
    #34352199
dimadv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
Здравствуйте, такой вопрос, нужна какя нибудь структура или динамический массив, которая удобно динамически добавляет
и удаляет элементы, но и одновременно предоставляет доступ к указателю на массив.

Посоветуйте что нибудь.
...
Рейтинг: 0 / 0
23.02.2007, 18:14
    #34352261
man_555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
std::vector
...
Рейтинг: 0 / 0
23.02.2007, 18:23
    #34352272
Lexogen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
std::vector
тип последовательного контейнера, который используется в большинстве случаев;
std::list
используется, если нужно часто вставлять или удалять елементы в произвольной позиции;
std::deque
если большинство вставок или удалений производится в начале или конце.
...
Рейтинг: 0 / 0
23.02.2007, 22:27
    #34352437
man_555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
насчёт списка - неправда, потому как он не предоставляет доступ по индексу, в чём заключается основное свойство массива.
...
Рейтинг: 0 / 0
24.02.2007, 17:47
    #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
24.02.2007, 19:21
    #34353001
ErV
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
24.02.2007, 19:46
    #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
25.02.2007, 16:51
    #34353531
dimadv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
Большущее СПАСИБО!!!!)))
...
Рейтинг: 0 / 0
26.02.2007, 09:51
    #34354118
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
Анатолий ШироковТолько для std::vector есть гарантия непрерывного размещения элементов в памяти, следовательно валидным является вариант только c std::vector:
...

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

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

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

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

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

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

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

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

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

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

Вы можете и это бредом посчитать, но знайте, что в данном случае вы испольуетете данные о которых не имеете полное представление в случае, когда знание полного представления необходимо. Советовать ничего вам не буду, но обращу ваше внимание, что объекты необходимо использовать по назначению, и нет смысла использовать их внутереннюю конкретную реализацию, там где от вас ждут простых вещей.
...
Рейтинг: 0 / 0
26.02.2007, 12:10
    #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
26.02.2007, 12:59
    #34354691
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
2 onstat-

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

2 Akh

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

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

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


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

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

Или вы будете и дальше спорить? ;)
...
Рейтинг: 0 / 0
26.02.2007, 13:59
    #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
26.02.2007, 14:08
    #34354934
Akh
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
26.02.2007, 14:15
    #34354951
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
Это цитата из стандарта. Я вам уже давал линк на стандарт, то что вы неудосужились его открыть - это ваша проблема. На этом я заканчиваю дискутировать с вами. Пишите как хотите, но не сбивайте с толку людей своим ИМХО.
...
Рейтинг: 0 / 0
26.02.2007, 14:23
    #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
26.02.2007, 14:30
    #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
26.02.2007, 14:32
    #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
26.02.2007, 15:32
    #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
26.02.2007, 15:34
    #34355240
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
Я вам отправил на указанный вами в профиле почтовый ящик стандарт 2003 года.
...
Рейтинг: 0 / 0
26.02.2007, 15:40
    #34355260
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
Анатолий ШироковЭто цитата из стандарта. Я вам уже давал линк на стандарт, то что вы неудосужились его открыть - это ваша проблема. На этом я заканчиваю дискутировать с вами. Пишите как хотите, но не сбивайте с толку людей своим ИМХО .

то алл:

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


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