gpt4 book ai didi

c++ - 为什么我可以使用 for 循环而不是单独访问 C++ map 元素?

转载 作者:行者123 更新时间:2023-11-28 04:28:52 25 4
gpt4 key购买 nike

下面的代码有点问题。

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

std::map<std::string, int> m; //Dictionary map

int main() {

std::ifstream dictionaryFile("dictionary.txt");

std::string str;
int probability = -1;

//Read dictionary.txt and assign to map
while(std::getline(dictionaryFile, str)) {

if(str.find("#!comment:") == std::string::npos) { //Not a comment
m.insert(std::pair<std::string, int>(str, probability));
}
else {
probability++;
}

}

dictionaryFile.close();


//Iterate and print through map -- THIS WORKS
std::map<std::string, int>::iterator pos;
for(pos = m.begin(); pos != m.end(); ++pos) {
std::cout << "Key: " << pos->first << std::endl;
std::cout << "Value: " << pos->second << "\n" << std::endl;
}

//Is "very" in the map? -- THIS DOES NOT WORK
std::cout << m.find("very")->second << std::endl;

if(m.find("very") != m.end()) {
std::cout << "found it" << std::endl;
} else {
std::cout << "did not find it" << std::endl;
}

}

我读入“dictionary.txt”文件,并将每个单词插入 map 。 1 或 2 是与该键关联的值,具体取决于单词的概率。

我能够遍历 map 并从 for 循环中打印它的元素,如图所示。但我无法使用 m.find()、m.count() 或 [] 运算符单独访问每个元素。每一个都显示 map 是空的。

我有句语法错误吗?我在 std::map 中发现了错误吗?任何帮助将不胜感激!

这里是 dictionary.txt如果你愿意的话。

最佳答案

您的文件包含 Windows CRLF 行结尾 \r\n。这些在 Windows 上使用默认的 istream 处理自动转换为 \n。但是,您所处的 Linux 系统会将您的 \r 字符视为没什么特别的。

有多种解决方法。最简单的方法是在 Linux 上不使用此类文件作为输入。您可以在本网站的其他地方找到有关如何在 shell 中转换行尾的答案。

如果您绝对希望您的程序能够处理它们,那么您需要引入一些额外的代码。它可以像检查最后一个字符一样简单:

if (!str.empty() && str.back() == '\r')
str.pop_back();

对于没有std::string::pop_back的C++11之前的标准库,你可以调用str.erase(str.size()-1 ) 代替。

关于c++ - 为什么我可以使用 for 循环而不是单独访问 C++ map 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53512103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com