Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.6.75] |
|
Страницы: (7) « Первая ... 5 6 [7] все ( Перейти к последнему сообщению ) |
Сообщ.
#91
,
|
|
|
Кстати, по мап-у.
А если часто используется поиск и полный перебор по всем данным? |
Сообщ.
#92
,
|
|
|
Цитата Black_Dragon @ А если часто используется поиск и полный перебор по всем данным? Немношко неправильный вопрос! "часто используется поиск" - это вывоз поисковой процедуры "полный перебор" - это вызов поисковой процедуры в условиях неупорядоченных данных Если ты хотел спросить "а если часто используется поиск" (гораздо чаще операций вставки) - то ответ прост: используй упорядоченные мапы. Хотя.. я об этом уже писал чуть ранее. Ну а если желаешь "полный перебор" - понятное дело, неупорядоченные мапы. |
Сообщ.
#93
,
|
|
|
Цитата JoeUser @ "полный перебор" - это вызов поисковой процедуры в условиях неупорядоченных данных for (auto &itmain : mainBase) |
Сообщ.
#94
,
|
|
|
Цитата Black_Dragon @ or (auto &itmain : mainBase) Ну если > c++11, то где-то так. |
Сообщ.
#95
,
|
|
|
Цитата Black_Dragon @ А если часто используется поиск и полный перебор по всем данным? По идее проще всего написать и проверить. Зависеть может много от чего - от адекватности хеш-функции, от частоты коллизий, от фазы Луны, в конце-концов |
Сообщ.
#96
,
|
|
|
Вообщем провел тест, тестовый набор 7,5 тыс записей
namespace MapBench { TEST_CLASS(TestMap) { public: size_t test_find_count = 400000000; size_t test_all_count = 1000000; size_t test_arr = 8; CMacAddr arrmac[8] = { CMacAddr(0x0036A9F36550), CMacAddr(0x002A23B31D00), CMacAddr(0x0025D2D1E778), CMacAddr(0x5661562BD93C), CMacAddr(0x40758E924A3C), CMacAddr(0xC1F0F3FD8CA0), CMacAddr(0x0B629D565000), CMacAddr(0xAE8FDD0C5E4C) }; TEST_CLASS_INITIALIZE(ClassInitialize) { SNMPManager::getManager()->startup(); if (SQLOpen()) { int size_bd = SQLReadBase(); Assert::IsTrue(size_bd > 0); SQLClose(); } else Assert::Fail(L"Don't Open"); } TEST_CLASS_CLEANUP(ClassCleanup) { SNMPManager::getManager()->cleanUp(); } TEST_METHOD(FindMap) { for (size_t iter = 0; iter < test_find_count; ++iter) { for (size_t ind = 0; ind < test_arr; ++ind) { auto it = mainBase.find(arrmac[ind]); Assert::IsTrue(it != mainBase.end()); } } } TEST_METHOD(AllMap) { for (size_t iter = 0; iter < test_all_count; ++iter) { for (auto &it : mainBase) { } } Assert::IsTrue(true); } }; } #define ETHER_ADDR_LEN 6 typedef u_char macaddr[ETHER_ADDR_LEN]; union unmacaddr { macaddr m_mac; // mac адрес UINT64 m_64mac = 0; struct { UINT32 m_l; UINT32 m_h; } m_32x2; unmacaddr() {} explicit unmacaddr(UINT64 mac) : m_64mac(mac) {} }; class CMacAddr { public: unmacaddr u; public: // Создание нулевого МАК-адреса CMacAddr() {} CMacAddr(const macaddr ptr) { for (size_t i = 0; i < ETHER_ADDR_LEN; ++i) u.m_mac[i] = ptr[i]; } CMacAddr(const CMacAddr &obj) { u = obj.u; } explicit CMacAddr(UINT64 obj) : u(obj) {}; // Создание МАК-адреса из текстовой строки, true - успешно static bool ConvertFromCStr(const CStr &txt, CMacAddr *ma); //CMacAddr(const CStr &txt); CStr Str() const; CWideStr WStr() const; bool IsZero() const { return (u.m_64mac == 0); } bool IsBroadcast() const { return (u.m_64mac == 0xFFFFFFFFFFFF); } CMacAddr &operator=(const UINT64 &obj) { u.m_64mac = obj; return *this; } bool operator<(const CMacAddr &obj) const { return (u.m_64mac < obj.u.m_64mac); } bool operator>(const CMacAddr &obj) const { return (u.m_64mac > obj.u.m_64mac); } bool operator==(const CMacAddr &obj) const { return (u.m_64mac == obj.u.m_64mac); } bool operator!=(const CMacAddr &obj) const { return (u.m_64mac != obj.u.m_64mac); } }; namespace std { template <> struct hash<CMacAddr> { using argument_type = CMacAddr; using result_type = size_t; result_type operator()(const argument_type &key) const { return static_cast<result_type>(key.u.m_32x2.m_l + key.u.m_32x2.m_h); } }; }; typedef std::unordered_map<CMacAddr, PDevice> mapMacDev; mapMacDev mainBase; std::map Прикреплённая картинка
std::unordered_map Прикреплённая картинка
|
Сообщ.
#97
,
Сообщение отклонено: Akina -
|