如何在map :: find中使用map :: end在C ++中

时间:2010-12-17 23:14:50

标签: c++ map iterator

我想使用C ++ map函数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代码snipet中做错了什么?我知道它与迭代器有关。

3 个答案:

答案 0 :(得分:3)

除了其他任何事情:

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

应该是:

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

在C ++(和C)中,ifs和whiles测试的条件必须用parens括起来。

答案 1 :(得分:3)

应该是:

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

答案 2 :(得分:1)

如果在其他答案中提到了括号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

这不是你要的吗?