Итератор и постоянный интегратор в C ++ - PullRequest
0 голосов
/ 23 декабря 2009

Какая разница?

Я хочу видеть, есть ли элемент в HashMap, и я только что узнал, что если я сделаю h [элемент], он вернет элемент по умолчанию, если он не найден, и не ноль. Как бы я использовал метод find итератора, чтобы увидеть, есть ли там элемент?

Спасибо

Ответы [ 5 ]

6 голосов
/ 23 декабря 2009

Предполагая, что вы говорите о STL, а не о какой-то сторонней библиотеке ... m[key] не просто возвращает объект по умолчанию, если ключ отсутствует на карте. создаст новый элемент на карте с этим ключом и созданным по умолчанию объектом в качестве значения.

Вы можете использовать это:

map<string, int> mymap;
//add items to it
map<string, int>::iterator it = mymap.find("key");
if (it != myMap.end()) {
    // 'key' exists; (it->second) is the corresponding int
}

Или, если вам не нужно получать объект (вы просто хотите узнать, существует ли он):

map<string, int> mymap;
//add items to it
if (mymap.count("key") == 1) {
    // 'key' exists
}
2 голосов
/ 23 декабря 2009

Вы используете метод find, чтобы увидеть, есть ли что-то в std :: map

std::map<std::string, std::string> myMap
std::map<std::string, std::string>::iterator it = myMap.find("foo");
if(it != myMap.end()) {
  //foo is in the map
} else {
    // foo isn't in the map
}

A const_iterator - это итератор, который при разыменовании возвращает постоянную версию того, на что он указывает. В приведенном выше примере, если it было const_iterator, то при разыменовании получилось бы const std::string

1 голос
/ 23 декабря 2009

Как объясняют другие ответы, для std::map вы можете использовать find.

Чтобы ответить на вопрос в заголовке:

Для итераторов const может относиться к самому итератору или к содержимому, на которое указывает итератор. Оба свойства ортогональны. С нотацией STL у вас есть следующие случаи:

  • iterator Содержимое и итератор могут быть изменены.
  • const_iterator Содержимое постоянное, итератор может быть изменен
  • const iterator Содержание может быть изменено, итератор является постоянным.
  • const const_iterator Содержимое и итератор постоянны.

Это похоже на указатели. Там const также может ссылаться на содержимое или сам указатель.

1 голос
/ 23 декабря 2009

Основное отличие состоит в том, что const_iterator нельзя использовать для изменения значения элемента на карте.

с использованием find метода

 hash_map <int, int> hm1;
   hash_map <int, int> :: const_iterator hm1_RcIter = hm1.find( 2 );

   if ( hm1_RcIter == hm1.end( ) )
      cout << "The hash_map hm1 doesn't have an element "
           << "with a key of 2." << endl;
   else
      cout << "The element of hash_map hm1 with a key of 4 is: "
           << hm1_RcIter -> second << "." << endl;
0 голосов
/ 23 декабря 2009

const-итераторы нужны, когда вы хотите, чтобы итератор перебирал const-контейнер. Попытка назначить неконстантный модифицируемый итератор в константный контейнер вернет ошибку компилятора. Это связано с тем, что неконстантный итератор потенциально может изменить контейнер const.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...