Предположим некоторая структура данных:
typedef struct {
std::string s;
int i;
} data;
Если я использую поле data.s
как ключ при добавлении экземпляров data
в карте типа std::map<std::string&, data>
, строка копируется? Действительно ли безопасно стереть элемент карты, потому что ссылка станет недопустимой?
Также сделайте ответы на эти вопросы также относятся unordered_map
?
Править:
Это - мое текущее решение..., но добавляющий итератор к карте УЖАСЕН:
typedef struct {
const std::string* s;
int i;
} data;
std::map<std::string, data> map;
typedef std::map<std::string, data>::iterator iterator;
// add an element to the map
iterator add_element(const std::string& s) {
std::pair<iterator, bool> p = states.insert(std::make_pair(s, data()));
iterator i = p.first;
if(p.second) {
data& d = (*i).second;
d.s = &(*i).first;
}
return i;
}
Вы не можете хранить ссылки в контейнерах стандартной библиотеки - ваша карта должна выглядеть так:
map <string,data> mymap;
Карта будет управлять как ключевой строкой, так и экземплярами структуры, которые будут копиями, для вас . Обе карты
и unordered_map
работают в этом отношении одинаково, как и все другие контейнеры стандартной библиотеки.
Обратите внимание, что в C ++ вам не нужны typedef для объявления структур:
struct data {
std::string s;
int i;
};
Я не думаю, что можно добиться большого выигрыша в производительности, если вы выберете указатель вместо объекта. Делайте это только в том случае, если вы управляете данными с большим количеством существующих строковых объектов, которые необходимо хранить внутри контейнера. Кроме того, перед разрушением контейнера необходимо управлять разрушением объектов вручную.
Вы можете посмотреть boost.ref . Он предоставляет оболочку, которая позволяет использовать ссылки в контейнерах STL следующим образом:
std::map<boost::reference_wrapper<std::string>, data>
Начиная с C ++ 11, это часть стандарта (до этого компиляторы, реализующие TR1, также предлагали его в std :: tr1
пространство имен).
Вы не можете использовать ссылку. Карта может копировать содержимое. Я думаю, это зависит от реализации.
Но проверено с помощью Microsoft STL.
struct data
{
data(data const& rhs)
{
a new object will be created here
}
std::string s;
int i;
};
Добавьте несколько объектов на карту, и вы столкнетесь с конструктором копирования. Это должно сделать вашу ссылку недействительной.