|
|
|
Динамический массив
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34355640&tid=2029363]: |
0ms |
get settings: |
7ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
190ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 528ms |

| 0 / 0 |
