есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.
спасибо.
Здравствуйте, toulon, Вы писали:
T>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.
Здравствуйте, toulon, Вы писали:
T>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию. T>спасибо.
А зачем?
Какой сценарий использования?
Будут ли вставки с фиксированным ключом, или он всегда будет генериться автоматически?
Будут ли удаления?
Если нет и нет, то можно просто использовать std::deque и индекс в качестве ключа — будет всяко быстрее std::map.
Здравствуйте, toulon, Вы писали:
T>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, toulon, Вы писали:
T>>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию. T>>спасибо.
J>А зачем? J>Какой сценарий использования? J>Будут ли вставки с фиксированным ключом, или он всегда будет генериться автоматически? J>Будут ли удаления? J>Если нет и нет, то можно просто использовать std::deque и индекс в качестве ключа — будет всяко быстрее std::map.
Сценарий следующий: периодически будут добавляться и удаляться элементы, ключ кстати будет int16 то есть 2 байта, а возможно в будущем даже 1 байт, когда элемент удаляется ключ освобождается и по идее его можно отдать при следующем добавлении, таким образом эффективнее использовать коллекцию. Использоваться все это будет в некоем протоколе сети со многими динамическими участниками.
Здравствуйте, toulon, Вы писали:
T>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, toulon, Вы писали:
T>>>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию. T>>>спасибо.
J>>А зачем? J>>Какой сценарий использования? J>>Будут ли вставки с фиксированным ключом, или он всегда будет генериться автоматически? J>>Будут ли удаления? J>>Если нет и нет, то можно просто использовать std::deque и индекс в качестве ключа — будет всяко быстрее std::map.
T>Сценарий следующий: периодически будут добавляться и удаляться элементы, ключ кстати будет int16 то есть 2 байта, а возможно в будущем даже 1 байт, когда элемент удаляется ключ освобождается и по идее его можно отдать при следующем добавлении, таким образом эффективнее использовать коллекцию. Использоваться все это будет в некоем протоколе сети со многими динамическими участниками.
Главный вопрос: зачем освобождать ключи (не данные которые они хранят)? Вы боитесь что они закончатся? Используйте int64. Экономия на размере -- бессмысленна.
код может выглядеть примерно так:
std::map<uint64_t, data> map;
map[map.rbegin()->first + 1] = val;
Если ключи отдаются наружу, то имеет смысл уже говорить не о ключах, а о хендлах (см. как это сделано в ОС).
Т.е. каждый ключ состоит из двух частей: собственно индекс ключа в таблице и секретная часть. Таким образом мы можем валидировать ключи и отказывать при попытки обращения по out-dated ключу, а так же снижается риск обратится по случайному ключу и получить данные (упрощается отладка).
Здравствуйте, toulon, Вы писали:
T>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию. T>спасибо.
Здравствуйте, Chorkov, Вы писали:
C>std::list C>(В роли ключа использовать итератор).
А может и просто new, а в качестве ключа адрес...
Что надо-то от коллекции?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском