|
|
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, такой вопрос, нужна какя нибудь структура или динамический массив, которая удобно динамически добавляет и удаляет элементы, но и одновременно предоставляет доступ к указателю на массив. Посоветуйте что нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 17:20 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
std::vector тип последовательного контейнера, который используется в большинстве случаев; std::list используется, если нужно часто вставлять или удалять елементы в произвольной позиции; std::deque если большинство вставок или удалений производится в начале или конце. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 18:23 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
насчёт списка - неправда, потому как он не предоставляет доступ по индексу, в чём заключается основное свойство массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2007, 22:27 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Все это понятно, но в конкретном случае , есть изменяющийся массив объектов ядра, который нужно подавать в функцию ожидания. если я использую например вектор, то как мне запихнуть его в эту функцию. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2007, 17:47 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
А если так попробовать? (: Код: plaintext 1. 2. 3. 4. или так?: Код: plaintext 1. 2. 3. 4. судя по содержимому <vector>, оба варианта должны работать без ошибок. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2007, 19:21 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Только для std::vector есть гарантия непрерывного размещения элементов в памяти, следовательно валидным является вариант только c std::vector: Код: plaintext 1. 2. 3. для std::deque нет такой гарантии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2007, 19:46 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Большущее СПАСИБО!!!!))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2007, 16:51 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковТолько для std::vector есть гарантия непрерывного размещения элементов в памяти, следовательно валидным является вариант только c std::vector: ... Гарантии на размер элемента массива нет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 09:51 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
AkhГарантии на размер элемента массива нет. :) Это вы о чем? Я говорил о гарантии непрерывного размещения элементов в памяти. Где вы прочитали о размере элемента - не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 11:06 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков AkhГарантии на размер элемента массива нет. :) Это вы о чем? Я говорил о гарантии непрерывного размещения элементов в памяти. Где вы прочитали о размере элемента - не знаю. В выводе о валидности результата. В последующих версиях между элементами могут появиться и метаданные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 11:12 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
AkhВ выводе о валидности результата. В последующих версиях между элементами могут появиться и метаданные. Бред. Пока это так и никто не собирается эту гарантию отменять. Или вы программируете исходя из того, что в будущем вся STL может быть отменена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 11:25 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков AkhВ выводе о валидности результата. В последующих версиях между элементами могут появиться и метаданные. Бред. Пока это так и никто не собирается эту гарантию отменять. Или вы программируете исходя из того, что в будущем вся STL может быть отменена? Придется для вас разжевать. Приближенно выглядит так: В векторе есть гарантия, что элементы массива размещены по порядку, но нет гарантии, что размер элемента массива равен размеру типа данных вектора. Или же вы программируете исходя из того :7, что в текущей реализации размер элемента массива в вектор раверн размеру заданных данных. Думаю, что и того изложения вам будет не достаточно для понимания. Тогда объясню на пальцах: Вот вы задали вектор HANDLE. Положили туда сто пятнадцать указателей. Вектор из разместил по очереди, но не гарантировал вам, что они идут плотную друг за другом; и оставил по 2 байта между ними для мета данных (ну, там типа, индексация, новые улучшения, т.д. и т.п.). Вы, наивно, предпологая, что данные идут вслед за другом, передали их в функцию, котороя предполагает, что ей дали указатель на массив HANDLE. Она не предполагала, что разработчик подсунет ей ссылку на элемент вектора. Первый элемент оказался правельноым, а вот второй получил в два наименее значимых байта метаданные, а остальные сдвинутыми. В итоге, второй HANDLE был испорчен. И это при том, что вектор гарантирует вам, что элементы будут распологаться по очереди. Вы можете и это бредом посчитать, но знайте, что в данном случае вы испольуетете данные о которых не имеете полное представление в случае, когда знание полного представления необходимо. Советовать ничего вам не буду, но обращу ваше внимание, что объекты необходимо использовать по назначению, и нет смысла использовать их внутереннюю конкретную реализацию, там где от вас ждут простых вещей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 11:54 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковТолько для std::vector есть гарантия непрерывного размещения элементов в памяти, следовательно валидным является вариант только c std::vector: Код: plaintext 1. 2. 3. для std::deque нет такой гарантии. Я бы такой гарантии не давал. Есть гаранития коррекнтой работы operaror[] & iterator. Которые, с свойю очередь, могут делает преобразования. Вычисление адреса обьекта другими средствами могут быть опасны. На реализацию Allocator нужно смотреть в каждом конкретном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 12:10 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
2 onstat- Посмотрите стандарт, чтобы убедится, что эта гарантия есть. То что вы ее не даете, согласитесь, мало кого волнует. 2 Akh Спасибо за разжовывание, но по-моему вы так и не поняли, что значит последовательное размещение элементов в памяти - это такое размещение элементов при котором, адрес следующего элемента вычисляется как адрес текущего элемента + sizeof(тип элемента) - именно за счет этого операция индексации [] имеет сложность O(1). Вы в следующий раз, чтобы вот так не позорится, всеже поднимите какой-нибудь материал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 12:59 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковСпасибо за разжовывание, но по-моему вы так и не поняли, что значит последовательное размещение элементов в памяти - это такое размещение элементов при котором, адрес следующего элемента вычисляется как адрес текущего элемента + sizeof(тип элемента) - именно за счет этого операция индексации [] имеет сложность O(1). Вы в следующий раз, чтобы вот так не позорится, всеже поднимите какой-нибудь материал. Вы ошибаетесь, считая, что сложность по времени O(1) операции [] достигается только за счет размещения элементов непосредственно друг за другом. Специально для вас поднял материал: Язык программирования С++. Специальное издание. Бьерн Страуструп. 17.1.3 Стандарт не предписывает специального представления для каждого стандартного контейнера. Или вы будете и дальше спорить? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 13:48 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
С чем спорить, с вашим невежеством? Пожалуй воздержусь. А вот на счет гарантии непрерывностого размещения элементов в 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(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 13:59 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковС чем спорить, с вашим невежеством? Пожалуй воздержусь. А вот на счет гарантии непрерывностого размещения элементов в 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(). Ну, и что вы думаете я на это отвечу? Сейчас тоже насочиняю, номер припишу и выложу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 14:08 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Это цитата из стандарта. Я вам уже давал линк на стандарт, то что вы неудосужились его открыть - это ваша проблема. На этом я заканчиваю дискутировать с вами. Пишите как хотите, но не сбивайте с толку людей своим ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 14:15 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков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. То что дальше там написано о количестве вызовов и реалокаций однозначно не говорит о том что данные распологаются неприрывно. Учитывая что размер вектора теоретически неограничен. Если не тяжело , приведите цитату подтверждающую гарантию непрерывного выделение памяти для вектора. Мне самому интересно найти это место. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 14:23 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков автор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 ) этого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 14:30 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Этого автор 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(). Прошу прощения. з.ыю почему нельзя редактировать сообщения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 14:32 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков2 onstat- Посмотрите стандарт, чтобы убедится, что эта гарантия есть. То что вы ее не даете, согласитесь, мало кого волнует. Сейчас это в первую очередь волнует меня. Какая у Вас версия ? У меня : ISO/IEC 14882 first edition 1998-09-01 Date of ANSI Аpproval: 7/27/98 Reference number: ISO/IEC 14882:1998(E) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 15:32 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Я вам отправил на указанный вами в профиле почтовый ящик стандарт 2003 года. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 15:34 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЭто цитата из стандарта. Я вам уже давал линк на стандарт, то что вы неудосужились его открыть - это ваша проблема. На этом я заканчиваю дискутировать с вами. Пишите как хотите, но не сбивайте с толку людей своим ИМХО . то алл: Попонтаваться и убежать - не считаю положительной чертой образованного человека. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 15:40 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
2 Akh Вы не привели ни одного аргумента, а лишь свое личное мнение. В каком направлении вы хотите продолжить беседу? А что касается понта, то вам необходимо разобраться в себе для начала, прежде чем награждать других своими качествами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 15:46 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Ну чтобы господам лучше спорилось приведу цитату из лучшей книги по 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]): // Вывод содержимого вектора в виде строки С ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:01 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
что-то эта строка выше полохо пропечаталась, исправил: &v == &v[0] + i ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:04 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
нифига себе квадратные скобки не воспринимает( [] внутри i ), думает что я курсивом писать хочу. попробую так Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:08 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковВы не привели ни одного аргумента, а лишь свое личное мнение. Ложь Анатолий ШироковА что касается понта, то вам необходимо разобраться в себе для начала, прежде чем награждать других своими качествами. Провокация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:12 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Ну вы еще подеритесь! А на самом деле я видел несколько реализаций STL, и у всех ноги растут из Степанова и Ли и ниразу еще запихивание &array[0], в функцию ожидающую в качестве параметра укзатель на массив не приводило ни к чему плохому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:30 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Местный писатель_Ну чтобы господам лучше спорилось приведу цитату из лучшей книги по 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. Этот результат может быть получен в результате Код: plaintext 1. Я бы с большим удовольствием увидел бы такой оператор в стандарте нежели требование размещать данные строго последовательно. ИМХО Хранить элементы вектора непрерывно - тупиковый путь . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:41 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
2 Akh Опять ниодного аргумента. Одни вопли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:49 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
2 Местный писатель Джосьютис лишь цитирует стандарт, цитату я приводил ранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:50 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковОпять ниодного аргумента. Одни вопли. Прочти топик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:55 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
2 Akh Я не понимаю, в чем вы меня хотите убедить, что между двумями элементами std::vector может быть "дырки"? Это не так. В чем еще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 16:59 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
blindedНу вы еще подеритесь! А на самом деле я видел несколько реализаций STL, и у всех ноги растут из Степанова и Ли и ниразу еще запихивание &array[0], в функцию ожидающую в качестве параметра укзатель на массив не приводило ни к чему плохому blinded, осталось дождаться реализации, когда приведет к плохому... Считаю, что подобное использование не является идеологически верным. Т.к. есть специальный интерфейс, который предоствляет доступ к определенным элементам контейнера, а не ко всему контейнеру в целом. Так как область применения контейнера не влючает использование его элементов в целом, то использование не по назначению, не может являться корректным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:02 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
А где криминал авторint foo(boo array[], size_t size) { ... } ... std::vector<boo> array(10); foo(&array[0], array.size()); ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:08 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЯ не понимаю, в чем вы меня хотите убедить, что между двумями элементами std::vector может быть "дырки"? Это не так. В чем еще? Уже не буду спрашивать "где ваши аргументы" по этому конкретному вопросу. Дырки - это только одно из предположений. Прочтите ответ к blinded. ПС: Вопрос не по теме: вы специально делаете наивный вид, что не понимаете мои высказываения, преследуя определенную целью, или просто не внимательно читаете? Вопрос относится не только к этому ответу, а практически ко всем в этом топике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:08 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
2 Akh Я просто не могу понять, что вы пытаетесь донести. Еще раз говорю, то что вы думаете или считаете - это все лишь, то что вы думаете или считаете. До сих пор вы не привели доказательства того, что между элементами могут быть дырки, значит не пожете подтвердить свои домыслы, следовательно ведете разговор без аргументов. Поэтому я не могу принять вашего "идеологически не верно". В чем не верно? По поводу моих аргументов -я, вроде, уже привел ссылку на стандарт. Или для вас это не аргумент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:19 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковА где криминал? авторint foo(boo array[], size_t size) { ....... memset (&array[0], 0, size); // с обычными мссивами делаю, а с веторами я не рискую. ....... } Что будет если где нибудь при сборке попадется не та реализация STL? И на каком эта бомба взорвется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:22 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Еще раз говорю, что мы сейчас говорим не о реализации, а о стандарте. Следовательно, если реализация не удовлетворяет требованиям стандарта она не вправе носить название STANDARD TEMPLATE LIBRARY. Стандарт это единственный документ, которым должен руководствоваться разработчик. Ньюансы есть, но в фундаментальных вещах разногласий быть не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:26 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЕще раз говорю, что мы сейчас говорим не о реализации, а о стандарте. Следовательно, если реализация не удовлетворяет требованиям стандарта она не вправе носить название STANDARD TEMPLATE LIBRARY. Стандарт это единственный документ, которым должен руководствоваться разработчик. Ньюансы есть, но в фундаментальных вещах разногласий быть не должно. В принципе согласен. Но есть ИМХО : Но непрерывность памяти это насколько не фундаментальная вещь что заносить ее в стандарт планформонезависимого языка по крайней мере недальневидно. Со стандартом я спорить ненамерен, есть много законов которые мне не нравятся, но я вынужден им подчиняться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:36 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Понимаете, разработчки std::vector должны были гарантировать непрерывное размещение, дабы иметь динамический аналог втроенного массива. В противном случае, нам бы пришлось пользоваться небезопасными динамическими массивами в стиле new POINT[] только лишь для того, чтобы передать в WinAPI функцию набор точек и прочее-прочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:44 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков2 Akh Я просто не могу понять, что вы пытаетесь донести. Еще раз говорю, то что вы думаете или считаете - это все лишь, то что вы думаете или считаете. До сих пор вы не привели доказательства того, что между элементами могут быть дырки, значит не пожете подтвердить свои домыслы, следовательно ведете разговор без аргументов. Поэтому я не могу принять вашего "идеологически не верно". В чем не верно? По поводу моих аргументов -я, вроде, уже привел ссылку на стандарт. Или для вас это не аргумент. На счет дырок я привел пример возможной реализации. На счет стандарта я привел цитату Страуструпа. То что она не состыкуется с вашей цитатой, означает что это скользкой вопрос, это и есть те "нюансы" о которых вы написали ниже. Рассмотрим идеалогию контейнера вектор, как я ее понимаю. Если вы будете в чем-то не согласны - поправляйте, если хотите. Только без личностных нападок (плохое впечатление о вас складывается). Так вот. Имеем шаблон контейнера, который может содержать объекты. Назовем его вектором и возложим на него требование - максимально быстро пробегать по элементам. Для этого у контейнера есть итератор и интерфейс доступа к элементам. Он выполняет свою функцию, все работает, все прекрасно. А теперь долго не думая, мы видим, что реализация размещения данных в этом случае очевидна - положить их друг за другом. Поэтому мы делаем вывод, который не следует из условий - в векторе данные лежат друг за другом, его данные можно тракторвать массивом. Т.е. еще раз - условие - очевидное размещение данных, вывод - в векторе они так лежат. Тем более, вывод, каким-то образом подтвержден стандартом, который вы привели. В итоге, мы используем, причем успешно, данные контейнера вектор, как массив и все хорошо. Ничего не происходит, т.к. реализации идут параллельно нашим размышлениям. Но остался не верный вывод. То что очевидно ложить данные друг за другом еще не значит, что они так лежат. Может между ними дырки (допустим, 4 байта интеджер, 2 байта метаданные, и т.д. v[n]=(type of element vector)((char*)(&v[0])+(sizeof(v[0])+C)*n)) или вариант от onstat-а или мало ли чего можно еще надумать. А раз так, значит наш код находится под угрозой, и следавательно он не может считаться корректным. Надеюсь, понятно изложил, что я считаю в данном случаю идеологией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 17:47 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Я считаю, что вы неверно трактуете термин contiguously из приведенной цитаты Код: plaintext 1. 2. Далее, если даже не обращать внимание на это замечание, то v\[i\] согласно стандарту, определенный как: Код: plaintext 1. возвращает reference, который определен как Код: plaintext который, согласно стандарту, определен как Код: plaintext 1. Следовательно в приведенной цитате 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 18:12 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЯ считаю, что вы неверно трактуете термин contiguously из приведенной цитаты Код: plaintext 1. 2. Далее, если даже не обращать внимание на это замечание, то v\[i\] согласно стандарту, определенный как: Код: plaintext 1. возвращает reference , который определен как Код: plaintext который, согласно стандарту, определен как Код: plaintext 1. Следовательно в приведенной цитате 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 в контексте рассуждений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 18:38 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Здесь достаточно того, что какие бы это преобразования ни были верно следующее: &v[n] = &v[0] + n = ((const char *)&v[0]) + n*sizeof(T); поскольку именно так определяется оператор + применительно к указателю на тип, где v[0] и v[n] - ссылки на T. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 19:48 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
ИМХО: Если не нравится <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. 2 Анатолий Широков Можно ссылочку на стандарт или хотя бы его код (по которому его можно найти)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 20:06 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Нашел код текущего стандарта (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] Возможно, там же есть и ссылки (просто не рыл) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 20:14 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Akh пишет: > Считаю, что подобное использование не является идеологически верным. > Т.к. есть специальный интерфейс, который предоствляет доступ к > определенным элементам контейнера, а не ко всему контейнеру в целом. Так > как область применения контейнера не влючает использование его элементов > в целом, то использование не по назначению, не может являться корректным. Да как ты все не допрешь-то, vector именно такое использование всегда и подразумевал. Именно как КОНТЕЙНЕРА В ЦЕЛОМ !! О чем тебе и говорят уже долго. Если завел нужное тебе capacity заранее, и не вызываешь функций, которые могут привести к реаллокации памяти, а они строго оговорены, то можешь использовать нутро vector как С-шний массив. Нпример, можно выполнить сортировку вектора С-шным qsort(). Если в типе T есть выравнивание, то оно ВХОДИТ в sizeof(T) и все хорошо, и в С, и в С++. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 20:22 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков абсолютно прав. Не понимаю зачем вообще спорить, только ради спора.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 21:22 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Ладно. Я пытался объяснить свою точку зрения, походу не вышло. Объснять другими словами, вижу нет смысла. Раз в данном случае это теоритический вопрос, думаю, можно на этом остановиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 09:43 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
EtLINАнатолий Широков абсолютно прав. Не понимаю зачем вообще спорить, только ради спора.. Не имею привычки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 09:44 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЯ считаю, что вы неверно трактуете термин contiguously из приведенной цитаты Код: plaintext 1. 2. Далее, если даже не обращать внимание на это замечание, то v\[i\] согласно стандарту, определенный как: Код: plaintext 1. возвращает reference, который определен как Код: plaintext который, согласно стандарту, определен как Код: plaintext 1. Следовательно в приведенной цитате 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. Тут я оканчательно понимаю, что мы друг друга не слышим. И нет смысла этого добиваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 09:46 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковЗдесь достаточно того, что какие бы это преобразования ни были верно следующее: &v[n] = &v[0] + n = ((const char *)&v[0]) + n*sizeof(T); поскольку именно так определяется оператор + применительно к указателю на тип, где v[0] и v[n] - ссылки на T. Такую формулировку можно рассматривать как виртуално непрерывное простраство, что абсолютно не значит что: Анатолий Широков Только для std::vector есть гарантия непрерывного размещения элементов в памяти Думаю на этом можно закончить обсуждение, так как в стандарте это однозначно не определено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 09:58 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
автор Такую формулировку можно рассматривать как виртуално непрерывное простраство, что абсолютно не значит что: Только не надо придумывать свою собственную терминологию. Непрерывность гарантируется стандартом и я уже устал это доказывать: &v[n] == &v[0] + n for all 0 <= n < v.size(). Ваши доводы относительно неоднозначности стандарта в этом вопросе не выдерживают никакой критики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 11:50 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков Непрерывность гарантируется стандартом и я уже устал это доказывать: моежете уже не доказывать. Вы упустили : автор гарантия непрерывного размещения элементов в памяти Будьте последовательны это очень важно в контесте разговора. Доказывать нужно было только эту фразу. Анатолий Широков &v[n] == &v[0] + n for all 0 <= n < v.size(). С этим я спорить ненамерен, потому, что тут все правильно. Анатолий Широков Ваши доводы относительно неоднозначности стандарта в этом вопросе не выдерживают никакой критики. Я не утверждал, что он неоднозначен. И критики тоже невидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 12:41 |
|
||
|
Динамический массив
|
|||
|---|---|---|---|
|
#18+
2 onstat- авторДоказывать нужно было только эту фразу. гарантия непрерывного размещения элементов в памяти std::vector это и есть &v[n] == &v[0] + n for all 0 <= n < v.size(). То с чем вы уже и не спорите. Все, извините, вы гоняете уже из пустого в порожнее. Ну как так можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 13:22 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2029363]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
180ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 534ms |

| 0 / 0 |
