地图尺寸()> 0但是begin()== end()

时间:2018-03-25 05:57:18

标签: c++ dictionary

我正在编写一个将数据存储在std::map中的类。使用我的add()方法向地图添加一些对后,我尝试std::cout这些对。然而,我写的循环是为了做到这一点"打破"一旦它试图访问第一对地图中的第一个元素。

class Database {
private:
  std::map<std::string, std::string> data;
public:
  void add(const std::string& key, const std::string& value) {
    data.insert(std::pair<std::string, std::string>(key, value));
  } 
  void display() const {
    for (auto it = data.begin(); it != data.end(); it++) {
      std::cout << it->first << "|\t" << it->second << std::endl; 
    }
  }
  // Other methods
};

如果我cout data.size(),我可以看到地图不是空的 - 在我的测试中,我的大小为3.同样,我可以看到{{1评估为data.empty()。但是,当我打印falsedata.begin()的地址时,它们是相同的,对我而言,这意味着地图实际 为空。我怀疑问题与此有关 - 循环试图获得data.end()但它不能,因为看起来地图是空的(......即使它不是?)

我错过了什么? (我在StackOverflow上写问题真的很新......请告诉我是否需要提供更多信息。)

1 个答案:

答案 0 :(得分:2)

上课,并在MCVE中使用......

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

class Database {
private:
  std::map<std::string, std::string> data;
public:
  void add(const std::string& key, const std::string& value) {
    data.insert(std::pair<std::string, std::string>(key, value));
  } 
  void display() const {
    for (auto it = data.begin(); it != data.end(); it++) {
      std::cout << it->first << "|\t" << it->second << std::endl; 
    }
  }
  // Other methods
};

int main()
{
    Database d;

    d.add("Hello", "World");
    d.add("Foo", "Bar");
    d.add("Bing", "Bong");

    d.display();
}

产生以下输出:

Bing|   Bong
Foo|    Bar
Hello|  World

这似乎按预期工作。

http://coliru.stacked-crooked.com/a/77b6a699ad3485a5