映射大小() > 0 但开始() == 结束()

Map size() > 0 but begin() == end()

本文关键字:开始 结束 gt 映射      更新时间:2023-10-16

我正在编写一个将数据存储在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
};

如果我coutdata.size(),我可以看到地图不是空的 - 在我的测试中,我得到的大小为 3。同样,我可以看到data.empty()的计算结果为false.但是,当我打印data.begin()data.end()的地址时,它们是相同的,对我来说,这意味着地图实际上是空的。我怀疑问题与此有关——循环试图it->first但不能,因为地图似乎是空的(...即使不是?

我错过了什么?(我真的很陌生,在StackOverflow上写问题...如果我需要提供更多信息,请告诉我。

采用上面的类,并在 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