Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Изучаю map. Надо сделать ассоциативный массив с быстрым поиском элемента по ключу. Тут map идеально подходит. Значение в реале будет не char[40], а структура такого же размера с инфой которую надо будет постоянно менять. (Если это принципиально). Попробовал map<string, char[40]> пример кода 1 (ключ string) Код: 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. Отлично подходит. Быстро работает. НО жрет память не по-детски: данный пример забирает 110 мб на 1 млн.элементов. Полезной инфы около 47 мб (7 ключ + 40 моя инфа), остальные 63 мб получается служебная инфа. (Память диспетчером задач смотрел). Попытался для ключа string заменить на char[10] пример кода 2 (ключ char) Код: 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. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Память расходует экономнее: занимает 80 мб из них 50 полезная инфа, 30 служебная. Но тут начались проблемы с компиляцией: как задать функцию сравнения ключей я разобрался (clsCharCompare) в результате чего даже заполнить получилось, но дальше какой-то взрыв мозга начинается. В инете ничего подобного не нашел. При компиляции, на строке Код: plaintext 1. выдает ошибку error C2679 binary '=' : no operator found which takes a right-hand operand of type ...error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::_Tree<_Traits>::iterator' (or there is no acceptable conversion) 1> with 1> [ 1> _Traits=std::_Tmap_traits<sKey_t,sValue_t,clsCharCompare,std::allocator<std::pair<const sKey_t,sValue_t>>,false> 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xtree(498): could be 'std::_Tree<_Traits>::iterator &std::_Tree<_Traits>::iterator::operator =(const std::_Tree<_Traits>::iterator &)' 1> with 1> [ 1> _Traits=std::_Tmap_traits<std::string,sValue_t,std::less<std::string>,std::allocator<std::pair<const std::string,sValue_t>>,false> 1> ] 1> while trying to match the argument list '(std::_Tree<_Traits>::iterator, std::_Tree<_Traits>::iterator)' 1> with 1> [ 1> _Traits=std::_Tmap_traits<std::string,sValue_t,std::less<std::string>,std::allocator<std::pair<const std::string,sValue_t>>,false> 1> ] 1> and 1> [ 1> _Traits=std::_Tmap_traits<sKey_t,sValue_t,clsCharCompare,std::allocator<std::pair<const sKey_t,sValue_t>>,false> 1> ] причем так компилируется Код: plaintext 1. Как понимаю - не прописано как выполнить = для моей структуры sKey_t , но как и куда это прописывать никак не могу сообразить :( Может функция какая-то есть взамен = С синтаксисом С++ у меня проблемы: вроде понятно в целом, разберусь, если пример похожий есть. Но на данный случай ничего похожего не нашел. Помогите запустить второй пример или дайте ссылку на что-то похожее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 12:34 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Немного накосячил во втором примере. Вместо Код: plaintext 1. надо Код: plaintext 1. Но проблему мою это никак не решает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 12:42 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Dima T, Мэп, от которого берется тип итератора, должен быть точно тем же что и для самого контейнера. А у вас в типе итератора отсутствует компаратор. Чтобы не извращаться, обычно пишут так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 14:35 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Dima TНО жрет память не по-детски: данный пример забирает 110 мб на 1 млн.элементов. Полезной инфы около 47 мб (7 ключ + 40 моя инфа), остальные 63 мб получается служебная инфа. (Память диспетчером задач смотрел). Для таких размеров лучше подходит boost::intrusive ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 15:18 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Dima T, Отлично подходит. Быстро работает. НО жрет память не по-детски: данный пример забирает 110 мб на 1 млн.элементов. Полезной инфы около 47 мб (7 ключ + 40 моя инфа), остальные 63 мб получается служебная инфа. (Память диспетчером задач смотрел). map имеет некоторые накладные расходы. Если нужно их избежать, нужно хранить данные в сортированном векторе и искать по нему бинарным поиском. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 15:20 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
MasterZivmap имеет некоторые накладные расходы. Это я понял и второй вариант меня устроит, но он не работает. Точнее map я наполнил, осталось что-то дописать, чтоб извлекать найденное. Насколько сложно это допилить? MasterZivЕсли нужно их избежать, нужно хранить данные в сортированном векторе и искать по нему бинарным поиском. Так и написал, только без вектора: кусок памяти и там сортированный массив структур. Бинарный поиск работает в два раза быстрее поиска map`а, но заполнение в 670 раз медленнее (0,7 сек против 470 сек.) (вставки в основном в середину), что и ожидалось, т.к. realloc() и memcpy() не быстрые. Попробую на вектор переписать, хотя бы код будет читабельнее. Хотя возможно мой исходный вариант быстрее будет (я realloc() немного оптимизировал, сделал чтоб сразу +50% памяти добавлял). Запустил тест вектора: заполнение вектора 1 млн. элементов со вставкой каждого в середину. Минут 20 уже молотит. Не уверен что с ним лучше будет. Прикинул тут статистику по времени: получается что мне будет map выгоднее если каждый элемент потребуется искать менее 6000 раз. У меня по плану 100-200 в сутки в среднем. Так что мне map желательно использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 18:22 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
boostДля таких размеров лучше подходит boost::intrusive А какая разница с точки зрения расхода памяти, где будет храниться обвязка узлов мэпа, в узле(как в intrusive) или снаружи узла (как в std)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 18:36 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Dima TMasterZivЕсли нужно их избежать, нужно хранить данные в сортированном векторе и искать по нему бинарным поиском. Так и написал, только без вектора: кусок памяти и там сортированный массив структур. Бинарный поиск работает в два раза быстрее поиска map`а, но заполнение в 670 раз медленнее (0,7 сек против 470 сек.) (вставки в основном в середину), что и ожидалось, т.к. realloc() и memcpy() не быстрые. Так вы не вставляйте в середину. Дописывайте в конец, а потом все за один раз отсортируйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 18:38 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТак вы не вставляйте в середину. Дописывайте в конец, а потом все за один раз отсортируйте. Знаю что отсортировать можно, но надо сразу в середину, т.к. элементы будут появляться/исчезать асинхронно в процессе работы. Задачу я в итоге все равно решу, алгоритмами или деньгами (будет работать у провайдера на VDSе), но хочется алгоритмами ограничится :) Мне кажется что я почти решил мою проблему, оптимально устраивающим меня способом, остались какие-то мелочи в допиливании второго примера. пример кода 2 (ключ char) Код: 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. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Или я ошибаюсь и там еще писать и писать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 20:32 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Используй хэш-таблицу вместо вектора и будет тебе счастье. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 20:36 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Dima T, А какая проблема-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2013, 21:28 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyboostДля таких размеров лучше подходит boost::intrusive А какая разница с точки зрения расхода памяти, где будет храниться обвязка узлов мэпа, в узле(как в intrusive) или снаружи узла (как в std)? У intrusive есть несколько преимуществ хорошо заметных на больших размерах. IssueIntrusiveNon-intrusiveMemory managementExternalInternal through allocatorInsertion/Erasure timeFasterSlowerMemory localityBetterWorseCan hold non-copyable and non-movable objects by valueYesNoException guaranteesBetterWorseComputation of iterator from valueConstantNon-constantInsertion/erasure predictabilityHighLowMemory useMinimalMore than minimalInsert objects by value retaining polymorphic behaviorYesNo (slicing) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2013, 02:41 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
boostMemory useMinimalMore than minimal Так я и спрашиваю, для мэпа в чем конкретно разница? Я лично ее не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2013, 07:16 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyDima T, А какая проблема-то? Такая error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::_Tree<_Traits>::iterator' (or there is no acceptable conversion) В первом посте написал: Dima T Как понимаю - не прописано как выполнить = для моей структуры sKey_t , но как и куда это прописывать никак не могу сообразить :( Может функция какая-то есть взамен = С синтаксисом С++ у меня проблемы: вроде понятно в целом, разберусь, если пример похожий есть. Но на данный случай ничего похожего не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2013, 08:55 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Dima TAnatoly MoskovskyDima T, А какая проблема-то? Такая error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::_Tree<_Traits>::iterator' (or there is no acceptable conversion) В первом посте написал: Dima T Как понимаю - не прописано как выполнить = для моей структуры sKey_t , но как и куда это прописывать никак не могу сообразить :( Может функция какая-то есть взамен = С синтаксисом С++ у меня проблемы: вроде понятно в целом, разберусь, если пример похожий есть. Но на данный случай ничего похожего не нашел. А вы исправили то что я вам первым же сообщением написал? Anatoly MoskovskyМэп, от которого берется тип итератора, должен быть точно тем же что и для самого контейнера. А у вас в типе итератора отсутствует компаратор. Чтобы не извращаться, обычно пишут так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2013, 16:35 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА у вас в типе итератора отсутствует компаратор. Я тормоз :) Сразу не понял о чем речь. Сейчас заработало. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2013, 17:48 |
|
||
|
map<char[10], char[40]> не могу откомпилировать
|
|||
|---|---|---|---|
|
#18+
Замерил скорость. Летает map<char[10], char[40]>, моя поделка тормоз по сравнению с ним :) По сравнению map<string, char[40]>: Заполнение вдвое быстрее Поиск в 6 раз быстрее (в 3 раза быстрее моего самодельного) Тут лишние 30 байт на один элемент стоят того чтоб их задействовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2013, 18:16 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38450937&tid=2019891]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
200ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 307ms |

| 0 / 0 |
