Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果键不存在,则使用[]运算符访问STL映射元素会添加新元素_C++_Stl - Fatal编程技术网

C++ 如果键不存在,则使用[]运算符访问STL映射元素会添加新元素

C++ 如果键不存在,则使用[]运算符访问STL映射元素会添加新元素,c++,stl,C++,Stl,在windows操作系统中,我使用[]操作符访问STL映射元素,如果键不存在,则使用默认值添加新元素。如何避免这种情况 #include <iostream> #include <map> #include <string> int main () { std::map<char,std::string> mymap; mymap['a']="an element"; mymap['b']="another element";

在windows操作系统中,我使用[]操作符访问STL映射元素,如果键不存在,则使用默认值添加新元素。如何避免这种情况

#include <iostream>
#include <map>
#include <string>

int main ()
{
  std::map<char,std::string> mymap;

  mymap['a']="an element";
  mymap['b']="another element";
  mymap['c']=mymap['b'];

  std::cout << "mymap['a'] is " << mymap['a'] << '\n';
  std::cout << "mymap['b'] is " << mymap['b'] << '\n';
  std::cout << "mymap['c'] is " << mymap['c'] << '\n';
  std::cout << "mymap['d'] is " << mymap['d'] << '\n';

  std::cout << "mymap now contains " << mymap.size() << " elements.\n";

  return 0;
}

Output:
mymap['a'] is an element
mymap['b'] is another element
mymap['c'] is another element
mymap['d'] is
mymap now contains 4 elements

对元素“d”的访问在映射中添加新元素,并将其初始化为默认值。如何避免在访问元素时添加新元素?

如果要确定对象是否已在映射中,请使用映射的“查找成员”功能

#include <iostream>
#include <map>
#include <string>

template <class Map, class Key>
void show(Map const &map, Key key) {
    auto pos = map.find(key);
    if (pos == map.end()) {
        std::cout << "key: '" << key << "' was not found\n";        
    }
    else {
        std::cout << "key: " << key << ", value: " << pos->second << "\n";
    }
}

int main ()
{
    std::map<char, std::string> mymap {
        { 'a', "an element" },
        { 'b', "another element" }
    };

    mymap['c'] = mymap['b'];

    show(mymap, 'a');
    show(mymap, 'b');
    show(mymap, 'c');
    show(mymap, 'e');

    std::cout << "mymap now contains " << mymap.size() << " elements.\n";

    return 0;
}
如果要确定对象是否已在地图中,请使用地图的“查找成员”功能

#include <iostream>
#include <map>
#include <string>

template <class Map, class Key>
void show(Map const &map, Key key) {
    auto pos = map.find(key);
    if (pos == map.end()) {
        std::cout << "key: '" << key << "' was not found\n";        
    }
    else {
        std::cout << "key: " << key << ", value: " << pos->second << "\n";
    }
}

int main ()
{
    std::map<char, std::string> mymap {
        { 'a', "an element" },
        { 'b', "another element" }
    };

    mymap['c'] = mymap['b'];

    show(mymap, 'a');
    show(mymap, 'b');
    show(mymap, 'c');
    show(mymap, 'e');

    std::cout << "mymap now contains " << mymap.size() << " elements.\n";

    return 0;
}
使用find而不是[]。如下所示:map::iterator it=mymap.find'a。 Find将返回一个迭代器,该迭代器指向具有用于查找的键的对象。对象是由键和值组成的成对对象。所以,您可以通过它->第一个键和它->第二个值来访问它们

如果在映射中找不到键,那么它将返回表示映射结束的结束迭代器。因此,您可以检查迭代器是否等于mymap.end

使用find而不是[]。如下所示:map::iterator it=mymap.find'a。 Find将返回一个迭代器,该迭代器指向具有用于查找的键的对象。对象是由键和值组成的成对对象。所以,您可以通过它->第一个键和它->第二个值来访问它们

如果在映射中找不到键,那么它将返回表示映射结束的结束迭代器。因此,您可以检查迭代器是否等于mymap.end


使用find而不是[]。[]在映射上是方便的,但它返回对映射中的值的引用。因此,如果地图条目不存在,它必须创建它才能拥有该引用。如果元素不存在,你希望发生什么?@juanchopanza-如果键不存在,我只是不想在访问元素时在地图中添加新元素。因为在我的代码中,当检查映射的大小时,它给出的大小为非零,这使我的逻辑失败。我也很好奇,当元素还没有在映射中时,您还期望发生什么。在其他语言中,您会遇到异常,但是C++不是触发异常的触发器,它们是为例外保留的。cases@usermgs如果你对我的回答满意,你可以接受使用find而不是[]。[]在映射上是方便的,但它返回对映射中的值的引用。因此,如果地图条目不存在,它必须创建它才能拥有该引用。如果元素不存在,你希望发生什么?@juanchopanza-如果键不存在,我只是不想在访问元素时在地图中添加新元素。因为在我的代码中,当检查映射的大小时,它给出的大小为非零,这使我的逻辑失败。我也很好奇,当元素还没有在映射中时,您还期望发生什么。在其他语言中,您会遇到异常,但是C++不是触发异常的触发器,它们是为例外保留的。cases@usermgs如果你对我的回答满意,你可以接受@如果您对我的答案感到满意,您可以接受我的答案@如果您对我的答案感到满意,您可以接受我的答案