C ++: вставить в std :: map, не зная ключа - PullRequest
1 голос
/ 22 сентября 2011

Мне нужно вставить значения в std :: map (или ее эквивалент) в любую свободную позицию, а затем получить ее ключ (чтобы удалить / изменить позже). Что-то вроде:

std::map<int, std::string> myMap;
const int key = myMap.insert("hello");

Возможно ли это сделать с помощью std :: map или для этого есть подходящий контейнер?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 22 сентября 2011

Помимо использования set, вы можете сохранить список назначенных (или свободных) ключей и найти новый ключ перед вставкой.Для map, индексированного int, вы можете просто взять последний элемент и увеличить его ключ.Но я скорее думаю, я бы пошел с простой std::vector;если удаление не поддерживается, вы можете сделать что-то простое, например:

int key = myVector.size();
myVector.push_back( newEntry );

Если вам нужно поддерживать удаление, то используйте вектор какого-то типа «возможно» (boost::optional и т. д.вы, вероятно, уже есть в вашем наборе инструментов, может быть, под названием Fallible или Maybe) может быть уместным.В зависимости от шаблонов использования (количество удалений по сравнению с общим количеством записей и т. Д.) Может потребоваться выполнить поиск в векторе, чтобы повторно использовать записи.Если вы действительно амбициозны, вы можете сохранить битовую карту бесплатных записей, устанавливая бит каждый раз, когда вы удаляете и вводите, и сбрасывая его всякий раз, когда вы снова используете пробел.

1 голос
/ 22 сентября 2011

Самое близкое к тому, что вы пытаетесь сделать, это, вероятно,

myMap[myMap.size()] = "some string";

Единственное преимущество, которое он имеет над std::set, заключается в том, что вы можете передавать целочисленные индексы другим модулям без необходимости знать тип std::set<Foo>::iterator или аналогичный.

1 голос
/ 22 сентября 2011

Вы можете добавить объект в std :: set, а затем поместить весь набор в карту.Но нет, вы не можете поместить значение в карту без ключа.

0 голосов
/ 22 сентября 2011

Если вы хотите добиться чего-то похожего на автоматически генерируемые первичные ключи в базах данных SQL, вы можете сохранить счетчик и использовать его для генерации уникального ключа.Но, возможно, вам действительно нужен std :: set.

0 голосов
/ 22 сентября 2011

невозможно.Такая операция потребует сложных знаний о типе ключа, чтобы узнать, какие ключи доступны.Например, std :: map придется увеличивать значения int для карт int или добавлять строки к картам строк.

Вы можете использовать std :: set и вообще отказаться от ввода.

...