2016-12-22 2 views
-5

Я пытаюсь скомпилировать приведенный ниже код в VS2015. Первая версия моей std :: map компилируется, но секундная версия не компилируется. Пожалуйста, дайте мне знать, что я делаю неправильно здесь ..std :: map find() возвращающая ошибка

std::map<int, std::string> _p; 
typedef std::pair<int, std::string> _q; 
_p.insert(_q(0, "Football0")); 
_p.insert(_q(1, "Football1")); 
std::string str = _p[1]; //OK...compiles and executes, no error, str = "Football1" as expected 

std::map<int, DataDictionary> _p1; 
typedef std::pair<int, DataDictionary> _q1; 

DataDictionary dd1; 
dd1.i = 0; 
dd1.version = "ver1"; 
_p1.insert(_q1(0, dd1)); 

DataDictionary dd2; 
dd2.i = 0; 
dd2.version = "ver2"; 
_p1.insert(_q1(1, dd2)); 

DataDictionary DD = _p1.find[1]; //error C3867: 'std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::find': non-standard syntax; use '&' to create a pointer to member 

Даже если я решу изменить зЬй :: Карта и использовать следующее, я получаю ту же ошибку:

std::map<std::string, DataDictionary> _p1; 
DataDictionary DD = _p1.find["1"]; //ERROR 

I я пытаюсь использовать карту с структурой DataDictionary и использовать синтаксис _p1.find["1"] для доступа к элементам, поскольку я предполагаю, что этот подход будет быстрее, чем объявление итератора на карту, а затем использовать find(). Пожалуйста помоги. Спасибо,

+2

['std :: map :: find()'] (http://en.cppreference.com/w/cpp/container/map/find) не возвращает тип, который, по вашему мнению, он делает. –

+2

Вы можете использовать квадратные скобки, [* индексный оператор *] (http://en.cppreference.com/w/cpp/container/map/operator_at) или ['find'] (http: //en.cppreference .com/w/cpp/container/map/find), который является обычным вызовом функции, поэтому использует круглые скобки. Вы смешиваете оба. – BoBTFish

+0

Спасибо за ваш ответ. Но учтите, что код - std :: string str = _p [1]; фактически работает. Только когда я пытаюсь вернуть struct вместо std :: string, я получаю ошибку компилятора – XMarshall

ответ

1

Я пытаюсь использовать карту со структурой DataDictionary и использовать _p1.find["1"] синтаксис доступ к элементам

Нет, вы пытаетесь использовать индексный оператор для функции-члена:

find("1") будет работать.

find["1"] не следует компилировать.

Рассмотрите возможность использования _p1.find("1"), или _p1["1"]. Разница между ними заключается в том, что find возвращает пару с позицией на карте и булевским флагом итератором (который может находиться за концом отображаемой последовательности), а оператор индекса (["1"]) возвращает либо ссылку на существующий элемент или добавляет элемент (если он не найден) и возвращает ссылку на него.

Чтобы проверить, содержит ли карта ключ, вместо этого используйте if(_p1.count("1")).

+0

Спасибо, что указал на мою ошибку. Маркировка как ответ .. – XMarshall

+0

@WhozCraig, спасибо, я исправил его. – utnapistim

0

Я думаю, что вы имели в виду

_p1.find("1"); 

он возвращает итератор найденного элемента.

использование

std::map<std::string, DataDictionary>::iterator item = _p1.find("1"); 

или

в C++ 11 вы можете сделать

auto item = _p1.find("1"); 
+0

Спасибо, но как, черт возьми, первая версия кода - std :: string str = _p [1]; работает. Единственное, что я не могу понять, это то, что ... только когда я пытаюсь вернуть struct вместо std :: string в качестве значения карты, я получаю ошибку компилятора – XMarshall

+0

@XMarshall, почему бы и нет? Вот как вы получили значение из std :: map.в вашем случае '_p [1]' возвращает значение, связанное с ключом '1' –

+1

@XMarshall' _p [1] 'использует [' std :: map :: operator [] '] (http: //en.cppreference .com/w/cpp/container/map/operator_at), что-то совершенно иное, чем ['std :: map :: find'] (http://en.cppreference.com/w/cpp/container/map/find) , – WhozCraig

Смежные вопросы