вопрос по коллекциям
От: toulon Россия  
Дата: 14.04.10 07:49
Оценка:
есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.
спасибо.
Re: вопрос по коллекциям
От: remark Россия http://www.1024cores.net/
Дата: 14.04.10 07:55
Оценка: 1 (1)
Здравствуйте, toulon, Вы писали:

T>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.


std::map<uint64_t, T> map;
uint64_t seq;

uint64_t insert(T v)
{
  uint64_t s = seq++;
  map.insert(std::make_pair(s, v));
  return s;
}



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: вопрос по коллекциям
От: jazzer Россия Skype: enerjazzer
Дата: 14.04.10 08:13
Оценка:
Здравствуйте, toulon, Вы писали:

T>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.

T>спасибо.

А зачем?
Какой сценарий использования?
Будут ли вставки с фиксированным ключом, или он всегда будет генериться автоматически?
Будут ли удаления?
Если нет и нет, то можно просто использовать std::deque и индекс в качестве ключа — будет всяко быстрее std::map.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: вопрос по коллекциям
От: potapov.d  
Дата: 14.04.10 08:25
Оценка: +2
Здравствуйте, toulon, Вы писали:

T>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.


std::vector<int> v;
...
v.push_back(value);
key = v.length();
Re[2]: вопрос по коллекциям
От: toulon Россия  
Дата: 14.04.10 08:34
Оценка:
Здравствуйте, remark, Вы писали:

R>
R>std::map<uint64_t, T> map;
R>uint64_t seq;

R>uint64_t insert(T v)
R>{
R>  uint64_t s = seq++;
R>  map.insert(std::make_pair(s, v));
R>  return s;
R>}
R>


R>


о таком решении конечно думал, но надеялся уже есть коллекция на просторах библиотек С++, удовлетворяющая моим запросам.
Re[2]: вопрос по коллекциям
От: toulon Россия  
Дата: 14.04.10 08:39
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, toulon, Вы писали:


T>>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.

T>>спасибо.

J>А зачем?

J>Какой сценарий использования?
J>Будут ли вставки с фиксированным ключом, или он всегда будет генериться автоматически?
J>Будут ли удаления?
J>Если нет и нет, то можно просто использовать std::deque и индекс в качестве ключа — будет всяко быстрее std::map.

Сценарий следующий: периодически будут добавляться и удаляться элементы, ключ кстати будет int16 то есть 2 байта, а возможно в будущем даже 1 байт, когда элемент удаляется ключ освобождается и по идее его можно отдать при следующем добавлении, таким образом эффективнее использовать коллекцию. Использоваться все это будет в некоем протоколе сети со многими динамическими участниками.
Re[3]: вопрос по коллекциям
От: saf_e  
Дата: 14.04.10 10:34
Оценка:
Здравствуйте, 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 ключу, а так же снижается риск обратится по случайному ключу и получить данные (упрощается отладка).
Re: вопрос по коллекциям
От: Chorkov Россия  
Дата: 14.04.10 12:25
Оценка: 1 (1)
Здравствуйте, toulon, Вы писали:

T>есть ли такая коллекция в STL или еще где-нибудь, хранящая пару ключ-значение (типа map), но чтобы можно было вставлять новый элемент не указывая ключа (ключ например простой int), а функция вставки возвращала любой свободный ключ? то есть не беспокоится за уникальность ключа и переложить его генерацию на коллекцию.

T>спасибо.

std::list

(В роли ключа использовать итератор).
Re[2]: вопрос по коллекциям
От: Erop Россия  
Дата: 14.04.10 19:59
Оценка: 1 (1)
Здравствуйте, Chorkov, Вы писали:

C>std::list

C>(В роли ключа использовать итератор).
А может и просто new, а в качестве ключа адрес...

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