Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614

О деталях и возможностях реализации <vector>

06.04.2016, 04:17. Показов 3661. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
 Комментарий модератора 
Эта тема выделена из темы: Работа с векторами без использования STL и библиотеки <vector>


Цитата Сообщение от hoggy Посмотреть сообщение
если он не будет защищен внутренними проверками.
я б такую халтуру вообще бы не принял.
Ну это уже в зависимости от зависимости. Примерно в 50% случаев внутренняя проверка только дает оверхед.
из кода AnsiString (той которая в комплекте C++ Builder)
C++
1
2
3
4
5
char operator [](const int idx) const
    {
      ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??
      return Data[idx];
   }
Так и сидит в инклюде который идет в поставке с таким комментарием.
в подавляющем большинстве случаев разумно вот так:
C++
1
2
3
4
5
6
7
char operator [](const int idx) const
    {
#ifdef __DEBUG__
      ThrowIfOutOfRange(idx);
#endif
      return Data[idx];
   }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2016, 04:17
Ответы с готовыми решениями:

О возможностях реализации поставленных задач
Здравствуйте уважаемые форумчане. На работе встала задача написать программу, которая из одной таблицы excel перетаскивала бы...

Скрыть <iostream> в деталях реализации
Здравствуйте, необходимо переместить #include &lt;iostream&gt; из .h в .cpp, и при этом использовать std::cout в определении шаблонной...

Программа для реализации арифметических операций Matrix, Vector
Помогите написать программу, для реализации арифметических операций классов Matrix, Vector.Спасибо заранее!

82
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 20:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
да точно внесен. Потому как вот так останавливается.
Не внесен он никуда. Просто, std::runtime_error - наследник std::exception, а std::exception (и всех его наследников) велено ловить силами программы. Про "Сишные строки" же в catch секции ничего не сказано, так что они летят к отладчику.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.04.2016, 20:18  [ТС]
Цитата Сообщение от Eldies Посмотреть сообщение
Внезапно, стандартных контейнеров для этого вполне достаточно.
Геморойно вся эта байда. Проще один раз изобрести список с константным временем удаления по значению элемента, пусть даже и завязанный так или иначе на элемент. Особенно если с расчетом на реюзание элементов. т.е. "удаленные" отдыхают в отдельном списочке пока не понадобятся, а физически распределяются страницами. Во всяком случае для тех кто могут интенсивно добавляться/удаляться.
Опять же это в реалтаймовой части. В части редактора и списков с O(n) временем удаления, а тем более с O(log(n)) будет выше крыши.

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
казалось бы: и при чем тут stl?
Ну или msvc в связке с stl екскепшинами
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 20:19
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
т.е. "удаленные" отдыхают в отдельном списочке пока не понадобятся, а физически распределяются страницами. Во всяком случае для тех кто могут интенсивно добавляться/удаляться.
Вы пытаетесь изобрести концепцию алокатора. Второй аргумент std::list для подобного выпендрежа и предназначен.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.04.2016, 20:36  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Второй аргумент std::list для подобного выпендрежа и предназначен.
Не хватало еще чтобы списки выделяли память под элементы. Не его списка забота откуда элемент взялся, куда элемент после удаления идет, и в какой список еще его потом всунут. тут им через перегрузку операторов new/delete действовать надо.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 20:38
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Не хватало еще чтобы списки выделяли память под элементы.
А он и не выделяет. Он использует выделятор переданный вторым аргументом.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.04.2016, 20:45
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну или msvc в связке с stl екскепшинами
казалось бы, при чем тут msvc?
1
08.04.2016, 20:46

Не по теме:

hoggy, Renji, бросьте вы эти глупости, вы же видите, что перед вами какой-то неадекват. Человек не то что не понимает, как STL работает, так ещё и переизобретает велосипеды с адовой скоростью. А ещё (что и неудивительно в силу вышеперечисленного) он лучше всех вас знает, как писать ПРАВИЛЬНЫЙ код, как работает дебаггер и зачем нужны исключения.

0
08.04.2016, 20:54

Не по теме:

Цитата Сообщение от DeadPenguin Посмотреть сообщение
бросьте вы эти глупости, вы же видите, что перед вами какой-то неадекват.
тем не менее, это человек моей породы.
и с ним мне общаться интереснее, и приятнее, чем со студентами,
которые требуют свои хелловорлды,
даже не поздаровавшись.

0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.04.2016, 21:10  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
А он и не выделяет. Он использует выделятор переданный вторым аргументом
То я знаю. Только толка от этого как с козла молока. Потому как выделятся они будут совсем не выделятором списка а на стороне. И удаляться тоже. т.е. смысл - вызвал delete он из всех списков выбросился, и в список свободных этого типа ушел. вызвали new - дернули из списка свободных, поместили в какие нужно списки. При этом общее количество очень быстро устаканится на каком то числе. Самый главный вопрос утрясти все это с наследованием и динамическим полиморфизмом, потому как в списках отдыха они естественно должны по типам сидеть, а пихать каждому указатель на список в который его отправлять на отдых тоже не есть очень карашо, так же как и виртуальную функцию возвращающую статик в каждый копипастить . млин лучше бы оператор __classid стандартизировали, и остальную rtti чем лисапеды стандартизировать из серии лаб первого семестра, причем еще и превращающих текст в говнокод.
Лисапед это таки очень многовариантная high-tech штука, на которую патенты выдают не раз в 10 лет как на колесо, и не раз в год как на гусеницу, а не реже раза в месяц.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 21:32
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
То я знаю. Только толка от этого как с козла молока. Потому как выделятся они будут совсем не выделятором списка а на стороне. И удаляться тоже. т.е. смысл - вызвал delete он из всех списков выбросился, и в список свободных этого типа ушел.
Тогда действительно перегрузите operator new/operator delete для конкретного типа. Кто-то мешает что ли?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
млин лучше бы оператор __classid стандартизировали
typeid в стандарте еще с прошлого века.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.04.2016, 21:54  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Кто-то мешает что ли?
Да нет никто не мешает. просто вот пришла мысль и я ее думаю. Как это перегрузить так чтобы для потомков не переписывать и каждый в своей тарелька сидел.
Цитата Сообщение от Renji Посмотреть сообщение
typeid в стандарте еще с прошлого века.
а вот так этот typeid умеет:
C++
1
FreeLists[__classid(this)]->Add(this);
Ну а чтобы из списка по указателю на элемент ремувить за O(1) элемент должен быть на список завязан. т.е. опять STL в пролете.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 22:08
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да нет. только вот чтобы из списка за O(1) ремувится нужно чтобы элемент был на список завязан.
Делается через сохранение в элементе итератора на узел списка. Хотя да, оптимальней было бы отнаследоваться от абстрактного list_node.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
а вот так этот typeid умеет:
Умеет. Про ассоциативные массивы слышали?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.04.2016, 22:11  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Про ассоциативные массивы слышали?
а за O[1]?

Добавлено через 1 минуту
Неужели компилятору так трудно положить в VMT ее порядковый номер и по оператору его возвращать?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 22:12
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
а за O[1]?
А за сколько по вашему std::unordered_map работает?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.04.2016, 22:13  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
А за сколько по вашему std::unordered_map работает?
O(log(n)) не быстрее однозначно.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 22:16
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
O(log(n)) не быстрее однозначно.
Значит, идите курить маны. Оно на хеш-таблицах, так что в 99% случаев работает за константное время. Еще 1% на феерических неудачников, словивших лбом фантастическое число коллизий.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.04.2016, 22:20  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Оно на хеш-таблицах, так что в 99% случаев работает за константное время.
Время вычисления хеша? Время сравнения? константное время тоже понятие растяжимое 1e1024 тоже константа.
Lists[__classid(this)] работает за нулевое время. ни одного сравнения. без всяких коллизий
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 22:27
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Время вычисления хеша? Время сравнения? константное время тоже понятие растяжимое 1e1024 тоже константа.
"Вычисляется" через typeid(*this).hash_code(). Если авторы компилятора не совсем идиоты, то очевидно что hash_code тупо возвращает вбитую на стадии компиляции константу.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
08.04.2016, 22:41  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Если авторы компилятора не совсем идиоты, то очевидно что hash_code тупо возвращает вбитую на стадии компиляции константу
Которая потом в этом унордеред мап сравнивается с каждым насколько понимаю.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 23:11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Которая потом в этом унордеред мап сравнивается с каждым насколько понимаю.
Гугл, "хеш-таблица". Ни с чем там хеш не сравнивается, он используется как индекс в хеш-таблице (константное время). После чего из таблицы извлекается список всех элементов с идентичным хешем. В нормальных условиях это полтора элемента. Вот у этих полутора элементов да, ключи сравниваются с образцом. При этом пихать в такой мап можно любые значения, не задаваясь вопросом "а не окажется ли __classid равным over 9000 и не вылечу ли я за границы массива?". Хотя, конечно, последнее не всегда актуально.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.04.2016, 23:11

Написать шаблон класса на основе класса vector для реализации стековой структуры данных
Пыталась написать код, но не уверена будет ли такая реализация корректной, можно ли это сделать как-то по - другому? И как надо...

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

О возможностях С++
Можно ли с помощью С++ авторизоваться на каком-то сайте ? Скачать определенный файл с сайта ? Работать с mysql ?

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

О возможностях ACCESS
Здравствуйте, товарищи специалисты, суть вопроса такова: Возможно-ли в акесе реализовать бд содержащую древовидный каталог? Причём...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru