如何在地图中区分0和false?

时间:2018-10-26 18:49:22

标签: c++ c++17 stdmap

我遇到了以下问题:

从地图上擦除键并再次调用该键后,它始终返回0。

那如果某个键的值设置为0怎么办?

#include <iostream>
#include <map>

int main(int argc, char const *argv[]) {
  std::map<std::string, int> mymap;

  mymap["a"] = 10;
  mymap["c"] = 10;
  mymap["b"] = 20;
  mymap["zero"] = 0;

  if (mymap["zero"])
    std::cout << "yes" << '\n';
  else
    std::cout << "no" << '\n

    mymap.erase("zero");

  if (mymap["zero"])
    std::cout << "yes" << '\n';
  else
    std::cout << "no" << '\n';


  std::cout << mymap["zero"] << '\n';


  return 0;
}

4 个答案:

答案 0 :(得分:3)

使用.count()代替使用 import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; .... .... MultipartEntity multipartEntity = new MultipartEntity(); FileBody fb = new FileBody(file, "application/octet-stream"); multipartEntity.addPart(fb); HttpClient httpClient = new DefaultHttpClient() ; HttpPost httpPostRequest = new HttpPost (url) ; //url above should be url of the Rest service endpoint httpPostRequest.setEntity(multiPartEntity) ;                 HttpResponse response = httpClient.execute(httpPostRequest) ; 来检查密钥是否存在:

if(mymap["key"])

您的问题是operator[]将创建一个新的键/值对(如果不存在)。来自cppreference:

  

返回对映射到等效于键的键的值的引用,如果该键尚不存在,则执行插入。

因此,如果您尝试使用if(mymap.count("zero")) { //key exists! ... 来判断键mymap["zero"]是否存在于地图中,那么它肯定会-您正在创建它!

答案 1 :(得分:3)

您需要的是count()函数。 iTween.RotateTo(mainModel, iTween.Hash( "z", this.gameObject.transform.eulerAngles.x + 90, "time", 1f, "easetype", "easeInOutSine", "looptype", "pingpong" )); 将返回元素数,如果不存在则不会构造对象。那会使您的if语句看起来像

count()

由于可以使用C ++ 17,因此如果要对元素(如果找到)进行处理,则可以利用它的新if语句语法,该语法允许您在if语句中声明变量并具有

if (mymap.count("zero"))
    // key exist here

答案 2 :(得分:3)

地图的

operator []将插入一个具有默认值的新条目。您应该改用find

if (mymap.end() != mymap.find(std::string{"zero"}))

答案 3 :(得分:2)

有几种选择。最简单的方法是使用1 2 3 4 5 6 7 8 9 10 11 12... 而不是std::map::find检查元素的存在,如果元素不存在,它将始终创建一个默认值。

另一个选项将operator[]设置为地图数据类型,然后检查是否设置了可选选项。