У меня есть следующее определение для boost unordered_map
typedef boost::unordered::unordered_map<std::String, CLIENT_STATE> CLIENT_MAP;
Где CLIENT_STATE — это структура, определенная следующим образом:
typedef struct{
unsigned char state;
/* socket fd of the client */
int fd;
/* File path requested by the client */
char file_path [255];
/* Current file offset */
unsigned long int offset;
} CLIENT_STATE;
Когда я пытаюсь добавить элемент в CLIENT_MAP с помощью emplace, CLIENT_MAP создает отдельную копию элемента, не связанную с исходным определением. т. е. любые модификации исходного определения элемента не будут вносить никаких изменений в элемент в unordered_map.
Раньше мне говорили, что использование emplace не будет клонировать мой исходный элемент, он поместит его непосредственно в контейнер, проверьте ссылка
Итак, как лучше всего сделать так, чтобы изменения добавленного элемента в контейнере влияли на исходное определение и наоборот.
Это то, что я имею в виду:
CLIENT_STATE new_client;
new_client.offset = 5;
client_map.emplace("Test", new_client);
new_client.offset = 10;
cout << client_map["Test"].offest;
cout не напечатает 10, он напечатает 5.
В настоящее время, чтобы решить эту проблему, после элемента unordered_map я работаю с возвращенным std::pair и делаю модификацию, но я думаю, что это неэффективный способ сделать это.
emplace
использует свои аргументы в качестве аргументов ctor - в случаеunordered_map
ctor, который вызывается emplace, - это ctor::std::pair<key_type, value_type>
- person gha.st   schedule 24.04.2014