Как использовать map :: end from map :: find в C ++ - PullRequest
2 голосов
/ 18 декабря 2010

Я хочу использовать функцию карты C ++, map :: find , чтобы определить, находится ли конкретная строка на карте.Я знаю, что find возвращает map::end, но я не уверен, как его использовать.Поэтому, если одна и та же строка существует как в names_, так и в info_, я хочу, чтобы она выводила эту строку на экран.

В моем заголовке:

std::vector<std::string>names_;
std::map<std::string, unsigned int> info_;

В .cpp(ЭТОТ КОД НЕПРАВИЛЬНЫЙ):

for(unsigned int i=0;i<names_.size();i++){
    std::map<std::string, unsigned int>::iterator it;
    it = info_.find(names_[i]);
    if info_.find(names_[i]) != info_.end()
        std::cout << names_[i] << std::endl; 
}

Что я делаю неправильно во фрагменте кода .cpp?Я знаю, что это что-то с итераторами.

Ответы [ 3 ]

3 голосов
/ 18 декабря 2010

Должно быть:

for(unsigned int i=0;i<names_.size();i++){
    if (info_.find(names_[i]) != info_.end())
        std::cout << names_[i] << std::endl; 
}
3 голосов
/ 18 декабря 2010

Помимо всего прочего:

if info_.find(names_[i]) != info_.end()

должно быть:

if ( info_.find(names_[i]) != info_.end() )

В C ++ (и C) условия, проверяемые if и while, должны быть заключены в парены.

1 голос
/ 18 декабря 2010

После очевидного исправления включения выражения if, если скобки упоминаются в других ответах, код работает.

#include <iostream>
#include <map>
#include <vector>

int main() {
  std::vector<std::string>names_;
  std::map<std::string, unsigned int> info_;
  names_.push_back("a");
  names_.push_back("b");
  names_.push_back("c");
  info_["a"] = 123;
  info_["c"] = 123;
  info_["d"] = 456;
  for(unsigned int i=0;i<names_.size();i++){
      std::map<std::string, unsigned int>::iterator it;
      if (info_.find(names_[i]) != info_.end())
          std::cout << names_[i] << std::endl;
  }
}

Выход:

a
c

Разве это не то, что вы просили?

...