对列表和对的混淆

confusion about lists and pairs

本文关键字:列表      更新时间:2023-10-16

所以我正在尝试尝试将名字和姓氏添加到双链表中。我有各种不同长度的文本文件,格式为"字符串,字符串",并且正在使用list>来存储我的数据。

我正在使用以下代码:

typedef std::list< std::pair<string,string> > listPair;

list<pair<string, string> > mylist;
ifstream myFile; 
myFile.open("20.txt");
pair<string, string> stuff;
while (myFile >> stuff.first >> stuff.second)
{
    mylist.push_back(stuff);
}
listPair::iterator iter = mylist.begin();
for(;iter != mylist.end();iter++)
{
    string s = (*iter).first;
    cout << s << endl;
    string c = (*iter).second;
    cout << c << endl;
}

现在我遇到的问题是,首先,列表中的最后一项没有添加。就像每个文件都错过了结束行,所以这有点令人困惑。

另外,我正在做一个"mylist.size()"来确保所有名称都已添加,这让我感到困惑,因为对于包含 99 个名称的文本文件,即 99 行文本,它会说(不要忘记由于缺少最后一行,它只在 98 中读取)列表的大小为 48。

为什么是48?是不是要做,因为我已经做了成对,这仍然没有意义,因为如果不成对阅读,实际上会有双倍的关于,因为对只是将名字和姓氏作为一个值。

令我难以置信。

再次感谢您的帮助!

我有一种感觉,你的文件实际上没有你所描述的值之间的空格,所以它看起来像这样:

one,two
three,four
five,six
seven,eight
nine,ten

如果你要在这个上运行你的程序,list的大小将是 2( floor(number_of_lines/2) ,给你 48),最后一行根本不会放在list中。为什么?

首先,每次调用std::ifstream::operator>>(std::string&)都会提取,直到它到达一些空白。在这种情况下,第一行的第一个空格是其末尾的n。因此,在第一次迭代中,stuff.first将被"one,two",然后下一行将被读入stuff.second,使其"three,four"。然后将其推入list。接下来的两行以相同的方式读取,为您提供 {"five,six","seven,eight"} 对 .在下一次迭代中,第一个operator>>将提取"nine,ten",第二个将失败,从而导致while条件结束并丢弃最后一行。

即使你确实有空格,你最终也会在每个pairfirst中出现逗号,这当然不是你想要的。

解决此类问题的更好方法是使用 std::getline 提取一行,然后根据需要分析该行:

std::string line;
std::pair<std::string, std::string> line_pair;
while (std::getline(myFile, line)) {
  std::stringstream line_stream(line);
  std::getline(line_stream, line_pair.first, ',');
  std::getline(line_stream, line_pair.second);
  mylist.push_back(line_pair);
}

我还建议使用std::vector,除非您有充分的理由使用 std::list .

ifstream 上的运算符>>将换行符视为另一个标记。因此,它可能会正常地从第一行读取您的第一个和第二个单词,但读取的第三个标记是第一行的新行。

尝试使用 getline 来"吃掉"换行符。