C ++中的迭代器和常量迭代器

时间:2009-12-23 17:39:33

标签: c++ iterator

区别是什么?

我希望能够看到一个元素是否在HashMap中,我发现如果我执行h [element],它将返回默认元素(如果找不到),而不是null。我如何使用迭代器查找方法来查看元素是否存在?

由于

5 个答案:

答案 0 :(得分:6)

假设您正在谈论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
}

答案 1 :(得分:2)

使用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
}

const_iterator是一个迭代器,当它被引用时返回它指向的任何const版本。在上面的示例中,如果itconst_iterator,则取消引用它将产生const std::string

答案 2 :(得分:1)

主要区别在于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;

答案 3 :(得分:1)

正如其他答案所解释的那样,对于std::map,您可以使用find

回答标题中的问题:

对于迭代器,const可以引用迭代器本身,也可以引用迭代器指向的内容。两个属性都是正交的。使用STL表示法,您有以下情况:

  • iterator可以修改内容和迭代器。
  • const_iterator内容为const,迭代器可以修改
  • const iterator内容可以修改,迭代器是常量。
  • const const_iterator内容和迭代器是不变的。

指针类似。在那里,const也可以引用内容或指针本身。

答案 4 :(得分:0)

当您希望迭代器遍历const容器时,需要使用const迭代器。尝试将非const可修改迭代器分配到const容器将返回编译器错误。这是因为非const迭代器可能会修改const容器。