Название: Контейнерные классы Отправлено: 8Observer8 от Февраль 02, 2014, 18:11 Привет!
Текст из книги Макса Шлее "Профессиональное программирование на С++. Qt 4.8": Цитировать При создании объекта класса QMap<K,T> нужно передать его размер в конструктор. Этот размер не является, как это принято в других контейнерных классах, размером, ограничи- вающим максимальное количество элементов, а представляет собой количество позиций. Количество позиций должно быть больше количества элементов, ожидаемых для хранения, иначе поиск элементов в словаре будет проводиться недостаточно эффективно. Желатель- но, чтобы это значение относилось к разряду простых чисел, т. к. в этом случае размещение элементов будет более удобным (см. приложение 2) Мне тут каждое предложение непонятно. Цитировать При создании объекта класса QMap<K,T> Зачем передавать размер?нужно передать его размер в конструктор. Цитировать Этот размер не является, как это принято в других контейнерных классах, размером, ограничи- В каких контейнерах требуется передать число, которое ограничит "максимальное количество элементов"?вающим максимальное количество элементов, а представляет собой количество позиций. Есть ли разница между "максимальным количеством элементов" и "количеством позиций"? Цитировать Количество позиций должно быть больше количества элементов, ожидаемых для хранения, Зачем задавать количество элементов? А если я не знаю ожидаемое число элементов, то насколько снизится эффективность в тех случаях, когда я не знаю ожидаемое число элементов и когда я его знаю (и могу выделить память заранее)?иначе поиск элементов в словаре будет проводиться недостаточно эффективно. Зачем выделять больше места для хранения, чем ожидается? Почему тогда разработчики QMap не учли, что нужно выделять больше? То есть если я выделяю столько-то, то на самом деле бы выделялось больше. А на сколько больше нужно указать? Цитировать Желательно, чтобы это значение относилось к разряду простых чисел, т. к. в этом случае размещение элементов будет более удобным (см. приложение 2) Признаюсь "приложение 2" ещё не читал, но очень интересно стало, почему именно простые числа (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 и т.д.)? Помогите прояснить эти вопросы. Заранее спасибо! Название: Re: Контейнерные классы Отправлено: Igors от Февраль 02, 2014, 19:03 Не вижу никакого параметра "размер" подаваемого в QMap - ни в Qt 4.7 ни в Qt 5.2. Также не знаю ни одного контейнера (ни в std ни в Qt) с ограничениями по размеру, все они растут пока не исчерпается память, затем выбрасывают исключение.
Вы что, обнаружили что Ваш QMap ищет недостаточно быстро? Если до этого дело не дошло - не занимайтесь фигней. Польза от пролистанных книг невелика. И не покупайтесь на слово "профессионально", что совсем не значит "круто" :) Название: Re: Контейнерные классы Отправлено: lit-uriy от Февраль 02, 2014, 19:51 8Observer8, про контейнерные классы читай в доке (http://www.doc.crossplatform.ru/qt/4.6.x/containers.html), а не у Шлее.
Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 03, 2014, 08:59 Igors, спасибо! Буду стараться вникать.
lit-uriy, спасибо большое за ссылку! Я как раз читаю эту документацию на английском. Теперь будет проще. Жалко не перевели тему "Неявное разделение данных" У Шлее есть параграф "Модель общего использования данных" Он всё верно описал? Цитировать Из соображений эффективности во многих классах Qt избегается копирование данных, вме- сто этого используется ссылка на эти данные (см. рис. 4 .12). Этот принцип получил назва- ние общее использование данных (shared d ata). В Qt используется модель неявных общих данных. В этой модели вызов конструктора копирования или оператора присваивания не приведет к копированию данных, а только увеличит счетчик ссылок на эти данные на 1. Соответственно, при удалении элемента счетчик ссылок уменьшится на 1. Если значение счетчика ссылок становится равным 0, то данные уничтожаются. Копирование данных про- исходит только при изменениях, соответственно значение счетчика ссылок при этом уменьшается. На рис. 4.12 на первом шаге создаются два объекта, и т. к. данные им не были присвоены, то они оба указывают на shared_null (общий ноль). На втором шаге первому объекту при- сваиваются данные, счетчик ссылок становится равным единице. На третьем шаге второму объекту присваивается первый объект, и они теперь оба указывают на одни и те же данные, счетчик ссылок при этом увеличивается на единицу. На четвертом шаге производится из- менение данных первого объекта, что приводит к созданию для него отдельной копии, а счетчик ссылок старых данных уменьшается на один, т. к. на один объект, использующий эти данные, стало меньше. Если бы мы пятым шагом изменили данные второго объекта, то после создания копии для новых данных счетчик ссылок старых данных уменьшился бы до значения 0, и это привело бы к освобождению памяти и уничтожению старых данных. (http://i6.pixs.ru/storage/3/2/1/122png_5123463_10724321.png) Цитировать Проиллюстрируем изображенную на рис. 4.12 ситуацию программным кодом: Код: QString str1; // Ссылается на shared_null Название: Re: Контейнерные классы Отправлено: m_ax от Февраль 03, 2014, 09:00 Также не знаю ни одного контейнера (ни в std ни в Qt) с ограничениями по размеру.. std::array http://ru.cppreference.com/w/cpp/container/array (http://ru.cppreference.com/w/cpp/container/array) Название: Re: Контейнерные классы Отправлено: Serr500 от Февраль 03, 2014, 09:03 У Шлее есть параграф "Модель общего использования данных" Он всё верно описал? Да. Всё верно.Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 03, 2014, 09:59 Спасибо за ответы!
Хочу научиться применять контейнеры и алгоритмы наиболее эффективно. Прошу мне помочь. Накидайте, пожалуйста, ссылок на ресурсы и книжки по Tulip и STL. Может вам попадались ресурсы где бы на практике тестировались STL и Qt контейнеры. Как здесь: http://microfork.com/stdvector-stdlist-stdqueue-preformance-analisys/ Вот какие материалы у меня сейчас под рукой: 1. Не жалею, что прочитал обзорную главу "Контейнерные классы" из книги Макса Шлее 2. Документация по Qt контейнерам на русском: http://www.doc.crossplatform.ru/qt/4.6.x/containers.html 3. Анализ производительности std::vector, std::list и std::deque: http://microfork.com/stdvector-stdlist-stdqueue-preformance-analisys/ 4. Алгоритм выбора STL-контейнера: http://habrahabr.ru/company/infopulse/blog/194726/ 5. Главы под названиями: - "Chapter 11: Delving into the Standard Library" - "Chapter 12: Understanding Containers and Itarators" - "Chapter 13: Mastering STL Algorithms" из книги Professional C++ (2nd Edition, 2012). В книге параллельно рассматривается C++11 Ссылка: http://kickass.to/wrox-professional-c-plus-plus-2nd-edition-2011-retail-ebook-debt-t7461950.html Исходники: http://www.wrox.com/WileyCDA/WroxTitle/Professional-C-2nd-Edition.productCd-0470932449,descCd-DOWNLOAD.html 6. Книга целиком об STL: "Эффективное использование STL" Ссылка: http://rutracker.org/forum/viewtopic.php?t=956876 Название: Re: Контейнерные классы Отправлено: Igors от Февраль 03, 2014, 11:47 Хочу научиться применять контейнеры и алгоритмы наиболее эффективно. Прошу мне помочь. Накидайте, пожалуйста, ссылок на ресурсы и книжки по Tulip и STL. Да я не видел и половины того что Вы привели :) (спасибо за полезные ссылки). Но теория и практика - разные вещи. Вот простая задачка из жизни:- есть структура данных Facet, которая содержит N чисел int. На практике частота N распределена примерно так - 3 числа (triangle) 80% - 4 числа (quad) 15 % - 1 или 2 числа (particle) 4% - 5 и более (complex) 1% Какой контейнер Вы бы использовали для хранения массива структур Facet (и как организовать саму структуру) ? Операции вставки/удаления редки (хотя имеются) Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 04, 2014, 21:51 Igors, спасибо большое за задачку :) Я подумаю.
Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 07, 2014, 12:50 Вот, что пишут про неупорядоченные ассоциативные контейнеры (хэш-контейнеры) из C++11 (из книги Professional C++)
Цитировать Insertion, deletion, and lookup with these unordered associative containers can be done on average in constant time. In a worst case scenario it will be in linear time. Lookup of elements in an unordered container can be much faster than with a normal map or set, especially when there are lots of elements in the container. Речь идёт об этих контейнерах: - unordered_map - unordered_set - unordered_multimap - unordered_multiset Вопрос об "усреднённом поведении (времени)". Правильно ли я понимаю (из текста выше), что если я вызову функцию вставки один раз, то получу самый наихудший вариант - линейное время? А если буду вызывать функции удаления и вставки столько раз сколько элементов в контейнере, то получу время, которое не зависит от количества элементов (константное время)? В цитате выше ещё написано, что поиск по хэш-контейнерам может быть выше, чем для нормальных map и set, особенно если много элементов. Получается, что если мне нужно часто искать и контейнеры большие, то лучше использовать хэш-контейнеры? Тогда я получу константное время поиска, вместо логарифмического? А что здесь имеется ввиду под словом "Lookup"? Это может быть поиск с помощью функции find(), а может быть доступ к элементам. Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 07, 2014, 13:22 Что такое "LOOKUP PERFORMANCE"? Это доступ к элементу по индексу или поиск элемента с помощью find()?
(http://i.pixs.ru/storage/1/5/8/123png_2802563_10778158.png) Название: Re: Контейнерные классы Отправлено: lit-uriy от Февраль 07, 2014, 14:01 LOOKUP - поиск (по ключу)
Название: Re: Контейнерные классы Отправлено: Igors от Февраль 07, 2014, 14:02 Igors, спасибо большое за задачку :) Я подумаю. Ну вот, думал человек за ум взялся. Ан нет :'(Вот, что пишут про неупорядоченные ассоциативные контейнеры (хэш-контейнеры) из C++11 (из книги Professional C++) Опять Professional = круто. Реально используются- вектор - QList - мапа - хеш - set (реже) - список (иногда) В Qt или std варианте (кто что любит). Эти контейнеры покрывают по меньшей мере 90% потребностей, и это, в общем, правильно. Злоупотребления в основном с вектором - напр нередко дека заметно лучше. Также выбор между мапой и хешем часто в пользу хеша, все читали что он "быстрее" - но это может быть и не так. Ну чего Вы лезете в фантастику типа unordered_map ? :) Может полагаете что используя его Вы сделаете нечто супер-быстрое? Напрасно. Качество и скорость определяются не "широтой" используемых средств, а тем насколько хорошо они соответствуют данным. Один и тот же контейнер может быть очень хорош для одних - но столь же плох для других. А сейчас у Вас "пальба по площадям". Выучите напр тот же QHash, прочувствуйте чем он хорош и плох, а еще лучше - напишите свой. Тогда вопросы с "unordered" собой отпадут - это всего лишь вариации того же кеша. Да, lookup - это просто поиск по ключу. В общем, я всегда говорил - надо меньше забивать голову книгами :) Название: Re: Контейнерные классы Отправлено: lit-uriy от Февраль 07, 2014, 14:04 Цитировать Получается, что если мне нужно часто искать и контейнеры большие, то лучше использовать хэш-контейнеры? Да.Перед вставкой вычисляется хэш элемента - это всегда число, затем вставка осуществляется по упорядочиванию хэша. Т.к. хэш - число, то поиск (читай сортировка) осуществляется быстро, следовательно поиск (lookup) происходит быстро. Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 07, 2014, 16:16 Но теория и практика - разные вещи. Вот простая задачка из жизни: - есть структура данных Facet, которая содержит N чисел int. На практике частота N распределена примерно так - 3 числа (triangle) 80% - 4 числа (quad) 15 % - 1 или 2 числа (particle) 4% - 5 и более (complex) 1% Какой контейнер Вы бы использовали для хранения массива структур Facet (и как организовать саму структуру) ? Операции вставки/удаления редки (хотя имеются) Чего-то маловато входных данных для задачки :D Название: Re: Контейнерные классы Отправлено: Johnik от Февраль 07, 2014, 16:53 Цитировать Не вижу никакого параметра "размер" подаваемого в QMap - ни в Qt 4.7 ни в Qt 5.2. Немного запоздало пишу, но все же.Классы: QList, QSet, QHash имеют метод reserve(int size) для резервирования памяти. Название: Re: Контейнерные классы Отправлено: Igors от Февраль 07, 2014, 17:40 Т.к. хэш - число, то поиск (читай сортировка) осуществляется быстро, Нет там никакой сортировки. Хеш - это просто "корзины" (bins). Хеш-значение (число) делится на число имеющихся корзин, остаток от деления есть индекс той корзины в которой искомый элемент. А внутри корзины уже по-всякому (часто перебором по списку). И все это хорошо, но в какой-то момент число корзин надо увеличить (rehash) поэтому какая-то вставка может оказаться дорогой. Ну наверное в вумных книгах все это лучше расписано. Чего-то маловато входных данных для задачки :D Или умения ее решить :)Классы: А также squeeze, который впрочем не везде работает. QList, QSet, QHash имеют метод reserve(int size) для резервирования памяти. [off]Ваше знание букваря (сладострастно называемого "документацией") не вызывает сомнений, но это неинтересно - и так уже много лет его жуют и жуют :) Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 07, 2014, 17:53 Или умения ее решить :) Тогда у меня аналогичная задачка: "Водитель перевозит каждый день людей. Парами, тройками, да и вообще в N количестве. Какой автомобиль ему выбрать, чтобы было удобнее это делать?". Название: Re: Контейнерные классы Отправлено: Bepec от Февраль 07, 2014, 17:57 Угу. Ещё добавим условие - тип местности, характер поверхности, погодные условия, планета пребывания, пол и нация должны учитываться :D
to Igors размазать задачу может каждый. Не каждый может нормально её сформулировать. Формулировки в вашем задании нет :D Название: Re: Контейнерные классы Отправлено: Old от Февраль 07, 2014, 18:13 Нет здесь задач - это традиционное раздувание щек и попытка произвести впечатление. :)
С традиционными высокомерными рекомендациями не учиться, потому что сам нахватался вершков и ему этого достаточно. Все как всегда. Уже даже перестаёт забавлять. :) Название: Re: Контейнерные классы Отправлено: Igors от Февраль 07, 2014, 19:35 Мужчины, а что это Вам так не нравится? Что предложена задачка из моей практики? И что в этом плохого? Кто же мешает показать "кол-во съеденных Вами корешков" :), вкупе с глубоким пониманием контейнеров? А нет желания и/или умения - так почему Вам скромно не промолчать (в тряпочку)? :)
Название: Re: Контейнерные классы Отправлено: Old от Февраль 07, 2014, 19:37 так почему Вам скромно не промолчать (в тряпочку)? :) Вы этот вопрос себе задайте. :)Посмотрите, из всех ваших постов в этой теме, вы не ответили ни на один вопрос ТС, зато успели дать "рекомендации", описать с цифрами якобы задачу и сообщить нам в очередной раз о том, что вы противник учения. Нет признания? Хотите его получить здесь? Только скажите, уверен все с удовольствием напишут, что вы лучший программист в мире и только вы решаете реальные задачи. Пишите лучше мемуары, а здесь давайте будем обсуждать технические детали. Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 07, 2014, 20:09 А кто задачку с автомобилем будет решать? ??? ;D
Название: Re: Контейнерные классы Отправлено: Igors от Февраль 07, 2014, 20:52 Нет признания? Хотите его получить здесь? Да с чего Вы взяли ??? Хз чем же я Вас задел что Вы так аж взвиваетесь? Я предложил простенькую задачку, какое в этом желание прославиться, получить признание и.т.п ??? описать с цифрами якобы задачу Какое "якобы"? Уверяю Вас, я ничего не выдумал, Вы легко можете убедиться что именно из таких элементов состоит полигонная 3D модель - а хранить ее придется и сообщить нам в очередной раз о том, что вы противник учения. Не противник, просто считаю практика важнее. А Вам (такому начитанному) никто не мешает показать обратное - спокойно, без понтов и переходов на личности.А кто задачку с автомобилем будет решать? ??? ;D Спрашивайте на форуме автомобилистов, Ваша задача к программированию отношения не имеет и поэтому мне неинтересна.Название: Re: Контейнерные классы Отправлено: Old от Февраль 07, 2014, 21:00 Хз чем же я Вас задел что Вы так аж взвиваетесь? Я предложил простенькую задачку, какое в этом желание прославиться, получить признание и.т.п ??? Причем здесь задачка? Меня удивляют ваши советы другим "не учится". Я считаю их очень не правильными.И ваши обобщения: что из контейнеров используется, а что нет, написанное за всех. Откуда вам это знать? А Вам (такому начитанному) никто не мешает показать обратное - спокойно, без понтов и переходов на личности. Что показать? Написать что означает lookup? ::) ;DНазвание: Re: Контейнерные классы Отправлено: OKTA от Февраль 07, 2014, 21:06 С нетерпением хочу услышать оптимальное решение вашей задачи.
Название: Re: Контейнерные классы Отправлено: Igors от Февраль 08, 2014, 10:59 Меня удивляют ваши советы другим "не учится". Я такого не советовал. А вот что тонна книг (пусть даже отличных) без живого опыта почти ничего не стоит - утверждал и утверждаю. Лучше меньше читать да больше делать чем наоборот.Я считаю их очень не правильными. Так пожалуйста, высказывайте свою точку зрения, мою критикуйте, опровергайте. Это нормально, в этом и ценность форума (вместо долбления букваря хором). А Вы что? Гоните волну, какие-то "психические атаки" - прямо не хочется Вам и отвечать.И ваши обобщения: С нетерпением хочу услышать оптимальное решение вашей задачи. А с чего Вы взяли что мне оно известно? :) Конечно я сделал, но насколько хорошо - хз. Имею право послушать какие решения предложат другие. Может и лучше можно.Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 08, 2014, 12:16 Задача
Igors, я бы с радостью попытался решить задачу, но я совершенно не понимаю условие. Lookup - не поиск В моём сообщении №10 я приводил картинку, где Lookup для vector'а был равен O(1). Поэтому я считаю, что Lookup это не поиск, а доступ к элементам через индекс. Для vector'а время доступа к элементам не зависит от количества элементов (O(1)), а время поиска будет прямопропорцианально количеству элементов (O(n)). Правильно? Телефонная книга Допустим мне нужна телефонная книга. Я задаю имя и получаю список телефонов. Что лучше выбрать QMultiMap или QMultiHash? Или разницы особой нет? Как это протестить и самому увидеть результат? Название: Re: Контейнерные классы Отправлено: Old от Февраль 08, 2014, 12:49 А вот что тонна книг (пусть даже отличных) без живого опыта почти ничего не стоит - утверждал и утверждаю. А с этим никто не спорит.Лучше меньше читать да больше делать чем наоборот. Что бы хоть что-то сделать, нужно знать что делать. Так везде, даже что бы мести улицы.Так пожалуйста, высказывайте свою точку зрения, мою критикуйте, опровергайте. Я так и делаю: высказываю свою точку зрения.А вы постоянно делаете утверждения от имени всей отрасли, кто, как и где использует, хотя и приблизительно не знаете, как обстоят дела на самом деле. Пишите от своего имени ("мне кажется...", "по моему мнению ...", "я использую..."), тогда всем будет ясно - что это ваше мнение. Название: Re: Контейнерные классы Отправлено: Old от Февраль 08, 2014, 13:03 Я задаю имя и получаю список телефонов. Что лучше выбрать QMultiMap или QMultiHash? Или разницы особой нет? Как это протестить и самому увидеть результат? Так вы почитали в чем разница между Map и Hash? :)Если нужно только искать, то при таких объемах (небольших) разницы вы не увидите. А вот если вы захотите пробегаться по всей коллекции, то разницу вы увидите сразу. Пробуйте. ;) Для простого замера времени выполнения можно воспользоваться void QTime::start() и int QTime::elapsed() const. Пример использования есть в ассистенте. Название: Re: Контейнерные классы Отправлено: Igors от Февраль 08, 2014, 19:51 Допустим мне нужна телефонная книга. Я задаю имя и получаю список телефонов. Что лучше выбрать QMultiMap или QMultiHash? А Вы собираетесь ее пополнять/редактировать? Если нет, то оба выбора - не лучшиеНазвание: Re: Контейнерные классы Отправлено: Johnik от Февраль 08, 2014, 23:04 Так вы почитали в чем разница между Map и Hash? Поддерживаю. И добавлю, на хабре пробегала статья: QMap vs. QHash: небольшой бенчмарк (http://habrahabr.ru/post/170017/)Если нужно только искать, то при таких объемах (небольших) разницы вы не увидите. А вот если вы захотите пробегаться по всей коллекции, то разницу вы увидите сразу. Пробуйте. ;) Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 10, 2014, 12:47 К Map и Hash я позже вернусь. Для меня это на данный момент сложновато.
Я сейчас с vector'ом разбираюсь. В следующей программке метод size() будет вызнан один раз или каждый раз пока работает цикл? Код: #include <iostream> Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 10, 2014, 12:55 Look at this ;)
http://codepad.org/BBfGJchj Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 10, 2014, 13:05 Look at this ;) http://codepad.org/BBfGJchj Я думал, тут хитрость есть, что для контейнеров один раз будет вызываться, так как если контейнер большой, то вызов size() будет очень дорогим. На форумах часто попадаются примеры, где size вызывается в цикле Значит размер буду вычислять до цикла ;) Спасибо! :) Код: #include <iostream> Название: Re: Контейнерные классы Отправлено: Igors от Февраль 10, 2014, 13:30 Я думал, тут хитрость есть, что для контейнеров один раз будет вызываться, так как если контейнер большой, то вызов size() будет очень дорогим. :) Почти для всех контейнеров вызов size() очень дешев, практически бесплатный, поэтому обычно локальную переменную не заводят. Из исключений могу вспомнить только std::listА вот типичная ловушка с вектором Код
Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 10, 2014, 13:39 Почти для всех контейнеров вызов size() очень дешев, практически бесплатный, поэтому обычно локальную переменную не заводят. Из исключений могу вспомнить только std::list Спасибо! Я думал у size линейная сложность :) Ан нет - константная: http://www.cplusplus.com/reference/vector/vector/size/ Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 10, 2014, 14:40 Вот в в этой книге http://www.wrox.com/WileyCDA/WroxTitle/Professional-C-2nd-Edition.productCd-0470932449.html (http://www.wrox.com/WileyCDA/WroxTitle/Professional-C-2nd-Edition.productCd-0470932449.html) постоянно делается упор на C++11, поэтому лучше по-современному, вот так:
Код: #include <iostream> Название: Re: Контейнерные классы Отправлено: Igors от Февраль 10, 2014, 15:53 ..поэтому лучше по-современному, вот так: Ах как резво Вы хватаете "вершки" :) Ловушку из предыдущего поста разберите, толку больше будетНазвание: Re: Контейнерные классы Отправлено: OKTA от Февраль 10, 2014, 15:59 Спасибо! Я думал у size линейная сложность :) Ан нет - константная: http://www.cplusplus.com/reference/vector/vector/size/ В общем случае, константная сложность не дает гарантии, что операция будет работать быстрее по сравнению с операцией с линейной сложностью, на сколько я знаю :) Название: Re: Контейнерные классы Отправлено: Fat-Zer от Февраль 10, 2014, 17:47 Немного запоздало, про то с чего тема начиналась...
Текст из книги Макса Шлее "Профессиональное программирование на С++. Qt 4.8": В Qt3 было несколько контейнеров Q{Int,Ascii,чего-то-там-ещё,}Dict, так это как раз про них. Передаваемый размер там задавал размер хеш-таблицы...Цитировать При создании объекта класса QMap<K,T> нужно передать его размер в конструктор. Этот размер не является, как это принято в других контейнерных классах, размером, ограничи- вающим максимальное количество элементов, а представляет собой количество позиций. Количество позиций должно быть больше количества элементов, ожидаемых для хранения, иначе поиск элементов в словаре будет проводиться недостаточно эффективно. Желатель- но, чтобы это значение относилось к разряду простых чисел, т. к. в этом случае размещение элементов будет более удобным (см. приложение 2) Мне тут каждое предложение непонятно. Дальше взял посмотреть книгу тов. Шлее про Qt-3.2... и что бы вы думали? В разделе «Словари» тот же текст слово в слово =) т.е. мало того, что оно безбожно устарело, так ещё и с ошибкой... это ещё 5 копеек к тому что стоит больше верить докам и меньше книгам... особенно отечественным... если что , то на все остальные вопросы «зачем оно нужно» итп — поймёшь, когда прочитаешь, что такое хеш... ;) Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 11, 2014, 13:58 Дальше взял посмотреть книгу тов. Шлее про Qt-3.2... и что бы вы думали? В разделе «Словари» тот же текст слово в слово =) Fat-Zer, Спасибо! Как я понял, автор скопировал информацию из старой книги и не поправил. Бывает!т.е. мало того, что оно безбожно устарело, так ещё и с ошибкой... это ещё 5 копеек к тому что стоит больше верить докам и меньше книгам... особенно отечественным... Да, согласен. Доверяй, но проверяй!если что , то на все остальные вопросы «зачем оно нужно» итп — поймёшь, когда прочитаешь, что такое хеш... Да, теория и практика у меня слабы. Стараюсь! Практика + Теория = ГармонияВ общем случае, константная сложность не дает гарантии, что операция будет работать быстрее по сравнению с операцией с линейной сложностью, на сколько я знаю :) Утверждение: Вставка элемента в середину vector'а (линейная сложность) будет работать гарантированно быстрее, чем доступ по индексу в том же векторе (константная сложность). Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 11, 2014, 14:04 Я думал, тут хитрость есть, что для контейнеров один раз будет вызываться, так как если контейнер большой, то вызов size() будет очень дорогим. :) Почти для всех контейнеров вызов size() очень дешев, практически бесплатный, поэтому обычно локальную переменную не заводят. Из исключений могу вспомнить только std::listА вот типичная ловушка с вектором Код
Отличный пример. Где-то подвох, но я его не понял :( Функция: Код: void func(vector<int> &vec) { Тест нормально проходит: Код: void newtestclass::testFunc_002() { Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 11, 2014, 14:09 Извините, неправильно сообщение написал. Исправил.
Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 11, 2014, 14:30 Вставка элемента в середину vector'а (линейная сложность) будет работать гарантированно быстрее, чем доступ по индексу в том же векторе (константная сложность). Разве нет? А почему? Чем больше размер вектора, тем линейная сложность будет больше, разве нет? :) Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 11, 2014, 14:37 Вставка элемента в середину vector'а (линейная сложность) будет работать гарантированно быстрее, чем доступ по индексу в том же векторе (константная сложность). Разве нет? А почему? Чем больше размер вектора, тем линейная сложность будет больше, разве нет? :) Чёрт! Я наоборот хотел написать. Доступ по индексу будет гарантинованно быстрее. Я хотел эту мысле высказать. Исправлю. Чем больше размер вектора, тем больше времени понадобится на вставку элемента в середину. Время вставки будет пропорционально (n-p), где n - количестно элементов в векторе, а p - позиция в которую вставляют. Время доступа к элементу по индексу не зависит от количества элементов - это константная сложность. Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 11, 2014, 14:54 Вставка элемента в середину vector'а (линейная сложность) будет работать гарантированно быстрее, чем доступ по индексу в том же векторе (константная сложность). Разве нет? А почему? Чем больше размер вектора, тем линейная сложность будет больше, разве нет? :) Чёрт! Я наоборот хотел написать. Доступ по индексу будет гарантинованно быстрее. Я хотел эту мысле высказать. Исправлю. Чем больше размер вектора, тем больше времени понадобится на встравку элемента в середину. Время вставки будет пропорционально (n-p), где n - количестно элементов в векторе, а p - позиция в которую вставляют. Время доступа к элементу по индексу не зависит от количества элементов - это константная сложность. Мне кажется, к понятию сложности стоит относиться именно в том плане, что линейная - возрастает, а константная не изменяется, а не в том, что одна гарантированно быстрее другой :) имхо как говорится) На это меня натолкнуло следующее) Математически есть смысл рассматривать лишь бесконечные последовательности задач: если размер входа ограничен, всякий алгоритм можно заменить большущей, но все же константного размера таблицей, в которой будет записано соответствие между входами и выходами, и алгоритм будет иметь константную сложность (и совершенно не важно, что константа эта может оказаться больше числа атомов во Вселенной). Взято из http://old.computerra.ru/offline/2005/603/225464/ Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 11, 2014, 15:01 Мне кажется, к понятию сложности стоит относиться именно в том плане, что линейная - возрастает, а константная не изменяется, а не в том, что одна гарантированно быстрее другой :) имхо как говорится) Подходящий контейнер же выбирают из расчёта, что он быстрее для требуемых частых операций. Какой-то в одном плане быстрее, какой-то в другом. А для оценки скорости придумали нотацию большого O и назвали "сложность". Чтобы можно было сравнить скорости работы, в контексте требуемых операций. Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 11, 2014, 15:09 Встретился интересный пример, где содержимое vector'а выводится в одну строчку (то есть без цикла):
Код: #include <iostream> Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 11, 2014, 15:47 Кстати, ловушку я тоже не могу определить никак :'(
Название: Re: Контейнерные классы Отправлено: Old от Февраль 11, 2014, 16:12 Кстати, ловушку я тоже не могу определить никак :'( Нужно вспомнить как вектор расширяется... ;)Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 11, 2014, 16:18 Кстати, ловушку я тоже не могу определить никак :'( Нужно вспомнить как вектор расширяется... ;)Пожалуйста, поподробнее. Зачем там ссылка? В ней подвох? Да? Название: Re: Контейнерные классы Отправлено: Old от Февраль 11, 2014, 16:30 Пожалуйста, поподробнее. Зачем там ссылка? В ней подвох? Да? Попробуйте добавлять в вектор значения и при этом печатать адрес первого элемента вектора. Должно все стать понятным.Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 11, 2014, 16:35 Нет гарантии, что адреса элементов останутся прежними? А как это в примере приведенном просматривается? ??? ???
Название: Re: Контейнерные классы Отправлено: Old от Февраль 11, 2014, 16:40 Нет гарантии, что адреса элементов останутся прежними? А как это в примере приведенном просматривается? ??? ??? Мы взяли адрес (ссылочка), добавили элемент и пытаемся по этому адресу изменить значение... А по этому адресу уже может вектора и не быть. :)Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 11, 2014, 16:45 Ой, точно, невнимательность меня сгубила) Спасибо)
Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 11, 2014, 17:00 Получается использование vector для хранения секретных данных крайне нецелесообразно, ибо при перераспределении старая память остается как есть и в ней могут остаться следы старой информации? Или все же со старой памятью что-то происходит?
Попробовал вот такой код: Код: #include <iostream> И в одном компиляторе он выдает вот такое: Код: Address of first element:: 0x603010 А в другом: Код: Address of first element:: 0x8051488 Это случайность или зависит от компилятора, как думаете? Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 11, 2014, 17:22 Нет гарантии, что адреса элементов останутся прежними? А как это в примере приведенном просматривается? ??? ??? Мы взяли адрес (ссылочка), добавили элемент и пытаемся по этому адресу изменить значение... А по этому адресу уже может вектора и не быть. :)Да... коварная ошибка. Если блока памяти не хватает для вектора (после добавления), то операционная система скопирует вектор в другую область памяти, где адреса будут другими, а мы запишем данные по старому адресу. А что будет в реальности после такой записи? Понятно, что программа не занулит элемент. А вот что будет если мы запишем по адресу который уже занял другой процессе? Операционка же не позволит и выдаст сообщение? Завершит наш процесс? Название: Re: Контейнерные классы Отправлено: Alex Custov от Февраль 11, 2014, 17:29 А вот что будет если мы запишем по адресу который уже занял другой процессе? Операционка же не позволит и выдаст сообщение? Завершит наш процесс? да, процесс упадёт с фатальной ошибкой Название: Re: Контейнерные классы Отправлено: Bepec от Февраль 11, 2014, 17:32 Не совсем правильно.
Операционка может просто сама упасть. Уже не раз в моей практике мои же программы опровергали "безопасть" работы с областями памяти разных процессов :D Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 11, 2014, 17:32 А вот что будет если мы запишем по адресу который уже занял другой процессе? Операционка же не позволит и выдаст сообщение? Завершит наш процесс? да, процесс упадёт с фатальной ошибкой Так наверно не процесс другой должен занять память, ведь память у каждого процесса своя, нет? И если идет обращение к памяти, которая инициализирована, то никакой ошибки не будет, если конечно не говорить о многопоточности. Или я что-то не так понимаю? Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 09:41 ??? куда все поховались ???
Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 12, 2014, 09:52 ??? куда все поховались ??? Это развитие темы не касается контейнерных классов. Мы поняли, что после vec.push_back() если блок памяти закончится, то операционка переместит весь вектор в другое место (хотя... тут есть сомнения, так как такие перемещения были бы дороги для компютера, может имелось введу какое-то хитрое перераспределение адресов? с другой стороны элементы в векторе хранятся последовательно, поэтому она перемещает весь вектор в другое более большое место). А к чему это приведёт и как операцианка отреагирует - это уже на совести разработчиков операционки, а не на совести разработчика прикладного ПО. Наша задача не допускать записи по уже недействительным адресам. Название: Re: Контейнерные классы Отправлено: 8Observer8 от Февраль 12, 2014, 09:57 А вот что будет если мы запишем по адресу который уже занял другой процессе? Операционка же не позволит и выдаст сообщение? Завершит наш процесс? да, процесс упадёт с фатальной ошибкойНе совсем правильно. Операционка может просто сама упасть. Уже не раз в моей практике мои же программы опровергали "безопасть" работы с областями памяти разных процессов :D Я склоняюсь в вашим версиям. Спасибо, парни! Название: Re: Контейнерные классы Отправлено: Igors от Февраль 12, 2014, 10:24 Да... коварная ошибка. Если блока памяти не хватает для вектора (после добавления), то операционная система скопирует вектор в другую область памяти, где адреса будут другими, а мы запишем данные по старому адресу. А что будет в реальности после такой записи? Понятно, что программа не занулит элемент. А вот что будет если мы запишем по адресу который уже занял другой процессе? Операционка же не позволит и выдаст сообщение? Завершит наш процесс? Было бы хорошо если всегда так. Но освобожденный блок памяти может опять распределиться (напр есть какое-то new после push_back). И запись может быть 100% легальной для ОС - ну записали куда-то нолик :) И кайф в том что происходит это редко, лишь когда растет пул вектора. Xорошо, а какие решения этой проблемы? Ну ясно можно всегда писать vec[ i ] (или итератор), но короткое имя не всегда возможно/желательно, да и доступ все-таки чуть медленнее. Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 10:34 А вот что будет если мы запишем по адресу который уже занял другой процессе? Операционка же не позволит и выдаст сообщение? Завершит наш процесс? Вот такие вещи на мой взгляд рушат все понимание и спустя время взрывают мозг. Объясните тогда, как простыми средствами с++ обратиться в память, занятую другим процессом? Название: Re: Контейнерные классы Отправлено: Old от Февраль 12, 2014, 10:41 Вот такие вещи на мой взгляд рушат все понимание и спустя время взрывают мозг. Объясните тогда, как простыми средствами с++ обратиться в память, занятую другим процессом? Никак.Все что в этой теме написано про память не соответствует действительности. :) Подробно писать с телефона не могу... Может вечером. Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 10:42 Вот такие вещи на мой взгляд рушат все понимание и спустя время взрывают мозг. Объясните тогда, как простыми средствами с++ обратиться в память, занятую другим процессом? Никак.Все что в этой теме написано про память не соответствует действительности. :) Подробно писать с телефона не могу... Может вечером. Этого ответа я и ждал :D :D :D Название: Re: Контейнерные классы Отправлено: Igors от Февраль 12, 2014, 10:47 А вот что будет если мы запишем по адресу который уже занял другой процессе? Операционка же не позволит и выдаст сообщение? Завершит наш процесс? Вот такие вещи на мой взгляд рушат все понимание и спустя время взрывают мозг. Объясните тогда, как простыми средствами с++ обратиться в память, занятую другим процессом? Название: Re: Контейнерные классы Отправлено: Bepec от Февраль 12, 2014, 10:53 Есть много тем, в которых обсасывается тема "адресное пространство у каждого процесса своё" и "доступ в память другого процесса не может быть совершен штатными средствами". Я им верил до той поры, пока моя программка (обработка больших массивов данных) не начала рушить запущенные программы. Особенно страдала линейка Word.
Пара программ вызывала BSOD'ы, причём проблема была просто в использовании "потерянных" указателей. Это моё мнение, конечно. Оно не имеет жестких обоснований и авторитетных заявлений, но "оно работает, но неправильно работает!". PS ещё забавный случай - программка для посыла и разбора кадров по корпоративному протоколу рандомно вызывала BSOD при частом приёме. Даже соревнование устроили, у кого упадёт быстрее. Название: Re: Контейнерные классы Отправлено: Igors от Февраль 12, 2014, 11:06 Есть много тем, в которых обсасывается тема "адресное пространство у каждого процесса своё" и "доступ в память другого процесса не может быть совершен штатными средствами". Я им верил до той поры, пока моя программка (обработка больших массивов данных) не начала рушить запущенные программы. Особенно страдала линейка Word. Есть 2 утверждения1) из одного процесса нет доступа к пр-ву др процесса 2) некорректные действия в рамках одного процесса не могут повлиять на др процессы Эти утверждения не равны и не тождественны, поэтому включать женскую логику не нужно :) Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 11:14 Есть много тем, в которых обсасывается тема "адресное пространство у каждого процесса своё" и "доступ в память другого процесса не может быть совершен штатными средствами". Я им верил до той поры, пока моя программка (обработка больших массивов данных) не начала рушить запущенные программы. Особенно страдала линейка Word. Есть 2 утверждения1) из одного процесса нет доступа к пр-ву др процесса 2) некорректные действия в рамках одного процесса не могут повлиять на др процессы Эти утверждения не равны и не тождественны, поэтому включать женскую логику не нужно :) Очень хорошо сказано. Название: Re: Контейнерные классы Отправлено: Bepec от Февраль 12, 2014, 13:55 А я повторюсь - моя программа (1 процесс) вызывала Critical Error у Word и иных программ (N-ные процессы).
Это утверждение. :) А ваши два утверждения ложные. Точнее не полные. Поправлю. 1) По заверениям разработчиков Microsoft и основываясь только на их словах - ни один процесс не может получить доступ к пространству другого процесса, если не использует специальное API и/или способы обхода ихнего утверждения. Пример: хуки/инжекты Dll/дебажное API Windows/ устаревшие функции. 2) Некорректные действия в рамках одного процесса не могут повлиять на другие процессы, если только они не используют общие источники данных, конфликтующие компоненты и/или иные связывающие их сущности. Так же некорректная работа одного процесса может убить системные службы и/или ОС, которые необходимы для работы иных процессов. Пример: буферы обменов, сокеты, работа с драйверами, неблокирующая работа с файлами, работа с пайпами, работа с Shared Memory, оконный менеджер Windows. PS добавим к этому ещё и баги ОС, которые я не привожу. Ибо это именно ошибки :) Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 14:24 Ну так это еще раз подтверждает, что для убийства других процессов, далеко не обязательно вмешиваться в их память ;D
А невозможность влезть в другой процесс без использования специальных средств - это простейшее обеспечение надежности и безопасности - без этого ни одна операционная система нормально бы не функционировала) У вас Верес что-то видимо косвенно влияло на Word) Вот, если интересно, забавное поведение с выделением и освобождением памяти) http://habrahabr.ru/post/158347/ Название: Re: Контейнерные классы Отправлено: Alex Custov от Февраль 12, 2014, 14:24 Так наверно не процесс другой должен занять память, ведь память у каждого процесса своя, нет? И если идет обращение к памяти, которая инициализирована, то никакой ошибки не будет, если конечно не говорить о многопоточности. Или я что-то не так понимаю? Я не специалист, из того что я знаю, могу сказать, что да, виртуальная память у каждого процесса своя, но это не значит, что он может записывать в любую нераспределённую память данные. Это действие вызывает фатальную ошибку (и трактуется как запись данных в чужое пространство) и закрытие программы (одна из причин SIGSEGV). Естественно, речь тут не идёт о законных методах вторжения в память, как инжект в Win32 API или ptrace. если только они не используют общие источники данных Это и называется "в рамках одного процесса". Если процесс в явном виде использует различные типы IPC, то он уже не standalone. Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 14:39 Так наверно не процесс другой должен занять память, ведь память у каждого процесса своя, нет? И если идет обращение к памяти, которая инициализирована, то никакой ошибки не будет, если конечно не говорить о многопоточности. Или я что-то не так понимаю? Я не специалист, из того что я знаю, могу сказать, что да, виртуальная память у каждого процесса своя, но это не значит, что он может записывать в любую нераспределённую память данные. Это действие вызывает фатальную ошибку (и трактуется как запись данных в чужое пространство) и закрытие программы (одна из причин SIGSEGV). Естественно, речь тут не идёт о законных методах вторжения в память, как инжект в Win32 API или ptrace. если только они не используют общие источники данных Это и называется "в рамках одного процесса". Если процесс в явном виде использует различные типы IPC, то он уже не standalone. Думаю, опять же правильнее оговориться, что не в любую нераспределенную память, а в "свою" нераспределенную память. И опять же, запись в нераспределенную память не обязательно вылетит с ошибкой. Это, как говорится, undefined behaviour. Название: Re: Контейнерные классы Отправлено: Alex Custov от Февраль 12, 2014, 14:48 Думаю, опять же правильнее оговориться, что не в любую нераспределенную память, а в "свою" нераспределенную память. Опять же насколько я знаю у процесса есть своя память, которая распределена, и не своя, которая делится на общий userspace и kernel. Нет такой памяти как "своя нераспределённая". И опять же, запись в нераспределенную память не обязательно вылетит с ошибкой. Это, как говорится, undefined behaviour. Это уже ошибка доступа к памяти в классической схеме защиты доступа к памяти, которая регулируется ядром, см. например https://ru.wikipedia.org/wiki/SIGSEGV Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 14:54 Думаю, опять же правильнее оговориться, что не в любую нераспределенную память, а в "свою" нераспределенную память. Опять же насколько я знаю у процесса есть своя память, которая распределена, и не своя, которая делится на общий userspace и kernel. Нет такой памяти как "своя нераспределённая". И опять же, запись в нераспределенную память не обязательно вылетит с ошибкой. Это, как говорится, undefined behaviour. Это уже ошибка доступа к памяти в классической схеме защиты доступа к памяти, которая регулируется ядром, см. например https://ru.wikipedia.org/wiki/SIGSEGV Да, с нераспределенной видимо так, ошибся. Да, ошибка сегментации, но например здесь опять же этой ошибки нет Код: #include <iostream> Название: Re: Контейнерные классы Отправлено: Igors от Февраль 12, 2014, 14:58 А ваши два утверждения ложные. Точнее не полные. А я и не утверждал что они истинные. Но если Вам удалось завалить такого быка как Word - это ведь совсем не значит что Вы вторглись в его адресное пр-во :) ОС Вындоуз предоставляет богатейшие возможности задрочить систему (что Вы перечислили лишь малая толика). В сочетании с талантом разработчика это дает изумительные результаты :)Название: Re: Контейнерные классы Отправлено: Alex Custov от Февраль 12, 2014, 15:07 но например здесь опять же этой ошибки нет ты же не знаешь наверняка, в свою память ты запишешь или нет, вот в чём фокус. Поэтому такой пример далеко не всегда упадёт. Слегка побив свою память, программа может запросто работать дальше, и упадёт только спустя некоторое время с SIGALARM на совершенно законной операции типа t = new T. Такие ошибки - это самый гемморой, особенно для виндоус пользователей, у которых нет valgrind. Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 15:09 но например здесь опять же этой ошибки нет ты же не знаешь наверняка, в свою память ты запишешь или нет, вот в чём фокус. Поэтому такой пример далеко не всегда упадёт. Слегка побив свою память, программа может запросто работать дальше, и упадёт только спустя некоторое время с SIGALARM на совершенно законной операции типа t = new T. Такие ошибки - это самый гемморой, особенно для виндоус пользователей, у которых нет valgrind. Спасибо, понял :) Название: Re: Контейнерные классы Отправлено: Bepec от Февраль 12, 2014, 15:10 "Адресное пространство - одно. Попытка разделить его - лишь иллюзия." Цитата из какой то умной книги.
to Alex Custov - любой процесс, абсолютно любой использует общие ресурсы :D Даже складывая 2+2 он обращается к менеджеру памяти, который... общий? :D В общем делаю для себя вывод. Завалить любой другой процесс - можно. ОС пытается этому помешать, но как заметил Igors имеются богатейшие возможности. Ещё прибавим сюда любознательного программиста, который пишет не понимая части выполняемых им самим действий и вуаля :D PS эт да, потерянные указатели на Windows - зло. Название: Re: Контейнерные классы Отправлено: Igors от Февраль 12, 2014, 15:12 Да, ошибка сегментации, но например здесь опять же этой ошибки нет ОС распределяет память страницами (обычно 4K). Обращение по любому адресу внутри страницы валидно для OC Название: Re: Контейнерные классы Отправлено: Alex Custov от Февраль 12, 2014, 15:15 to Alex Custov - любой процесс, абсолютно любой использует общие ресурсы :D он использует только то, что ему разрешили, при этом контролируя его действия. Конечно, можно уронить сервер, если у него есть ошибка переполнения буфера, но без прямой работы с его памятью, ибо это невозможно. Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 15:23 Да, ошибка сегментации, но например здесь опять же этой ошибки нет ОС распределяет память страницами (обычно 4K). Обращение по любому адресу внутри страницы валидно для OC Логично черт возьми! :o Название: Re: Контейнерные классы Отправлено: Igors от Февраль 12, 2014, 16:50 Отклонились от темы (впрочем вполне в рамках). Не хочется быть навязчивым, но все же
Xорошо, а какие решения этой проблемы? Ну ясно можно всегда писать vec[ i ] (или итератор), но короткое имя не всегда возможно/желательно, да и доступ все-таки чуть медленнее. Ну конечно речь идет не о "победе над битыми указателями", но в данном конкретном случае с вектором часто есть дешевое и хорошее решение (пусть и не очень популярное в широких кругах). Еще подсказка: оно полностью соответствует данной темеНазвание: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 16:56 Отклонились от темы (впрочем вполне в рамках). Не хочется быть навязчивым, но все же Xорошо, а какие решения этой проблемы? Ну ясно можно всегда писать vec[ i ] (или итератор), но короткое имя не всегда возможно/желательно, да и доступ все-таки чуть медленнее. Ну конечно речь идет не о "победе над битыми указателями", но в данном конкретном случае с вектором часто есть дешевое и хорошее решение (пусть и не очень популярное в широких кругах). Еще подсказка: оно полностью соответствует данной темеIgors, не обижайся, но ты всегда как-то дико формулируешь задачки и правило "в правильно заданном вопросе уже половина ответа" здесь не уместно ;D Ну или я такой чугунный ;D Название: Re: Контейнерные классы Отправлено: Igors от Февраль 12, 2014, 17:03 Igors, не обижайся, но ты всегда как-то дико формулируешь задачки и правило "в правильно заданном вопросе уже половина ответа" здесь не уместно ;D Ну или я такой чугунный ;D Не обижаюсь, но как в том анекдоте "а жизнь какая?" :) - ведь там Вам никто даже не намекнет что "решение есть". Так что нечего создавать тепличные условия, обильный хелп, видео-уроки - все это только разлагает.Edit: а решение очень простое, правда Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 12, 2014, 17:05 Да я банально не понял на моменте с
Цитировать Ну ясно можно всегда писать vec[ i ] (или итератор), Это имелось ввиду, что вместо указателя сразу делать Код: vec.push_back(vec[i]) А теперь вопрос, как сделать тоже самое без Код: vec[i] Название: Re: Контейнерные классы Отправлено: Igors от Февраль 12, 2014, 17:25 А теперь вопрос, как сделать тоже самое без Верно, но слишком узко. Иногда надо смотреть ширше. Мы убедились что минус вектора - перемещаемость данных - сейчас элемент по одному адресу, а нарастили вектор - уже по другому, что может повести к тяжелым ошибкам. Конечно если будем работать только по индексу - все норм. Но это часто неудобно - адрес самодостаточен, а вот индекс нет. Как это порешать? Код: vec[i] Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 13, 2014, 09:22 На сколько мне видится, в каждом конкретном случае удобно использовать свой механизм конечно, а в данном случае может быть переопределить push_back, чтобы возвращать указатель на ново-добавленный элемент?
Название: Re: Контейнерные классы Отправлено: Igors от Февраль 13, 2014, 10:20 На сколько мне видится, в каждом конкретном случае удобно использовать свой механизм конечно, а в данном случае может быть переопределить push_back, чтобы возвращать указатель на ново-добавленный элемент? А как Вы переопределите если push_back не виртуальный? И что даст указатель на новый? Проблема-то в том что старый адрес "уплыл". Название: Re: Контейнерные классы Отправлено: OKTA от Февраль 13, 2014, 10:55 Не то ляпнул) Вернее будет сказать перегрузить)) По новому адресу можно будет получить и адрес для элемента адрес которого уплыл.
Название: Re: Контейнерные классы Отправлено: Igors от Февраль 13, 2014, 11:05 Не то ляпнул) Вернее будет сказать перегрузить)) По новому адресу можно будет получить и адрес для элемента адрес которого уплыл. Не нужно лезть в такие дебри. Задача на "широту познаний" - а совсем не на "глубину". Все гораздо прощеНазвание: Re: Контейнерные классы Отправлено: OKTA от Февраль 13, 2014, 11:25 сдаюсь :-\
|