Wraz z nadejściem C++ 11, mamy unordered_map.cbegin/cend, aby konkretnie zwrócić nam wartości const_iterator. więc wyprowadzonym typem "it" w wyrażeniu "auto it = unordered_map.cbegin()" jest const_iterator.Oddany typ "auto it = unordered_map.find (key)"?
Jednakże, jeśli chodzi o funkcję unordered_map.find (key), myślę, że może brakować odpowiednika "cfind()", który zwraca konkretnie const_iterator.
Niektórzy mówią, że możemy użyć "const auto it = unordered_map.find (key)", aby uzyskać "const iterator", ale mam silne podejrzenie, że "const iterator" to ten sam "const_iterator", gdzie " const iterator "ogranicza możliwość zmiany samego iteratora, a" const_iterator "ogranicza możliwość zmiany zawartości, do której odwołuje się iterator.
Tak naprawdę, jeśli chcemy skorzystać z „auto” typu odliczenia pełnego (z wiedzy o niejasności lub odmiany typu „auto” dedukcji - Auto, Auto &, const auto &, itd.) , jak mogę mieć unordered_map.find (key), aby zwrócić "const_iterator" bez konieczności jawnego określenia "const_iterator" - to po wszystkim najlepszy przypadek użycia dla auto!
Poniżej znajduje się prosty przykład kodu, który demonstruje zachowanie kompilatora:
#include "stdafx.h"
#include <unordered_map>
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::unordered_map<int, int> umiit;
umiit umii;
auto it0 = umii.find(0);
it0->second = 42;
const auto it1 = umii.find(0);
it1->second = 42;
umiit::const_iterator it2 = umii.find(0);
it2->second = 42; // expected compiler error: assigning to const
return 0;
}
Na czym polega pytanie? –
Pytanie jest w czwartym akapicie: ** w jaki sposób mogę mieć unordered_map.find (key), aby zwrócić "const_iterator" bez konieczności jawnego określenia "const_iterator"?** – dfan