我有一个配对字符串列表,然后删除每个列表的顶部元素并进行比较。 但是,当我删除顶部元素与列表大小显着增加。 我已经尝试过pop_front(),制作迭代器等我知道如何发生同样的问题。
std::ifstream myReadFile;
std::list<std::pair<std::string,std::string>> startTape;
std::pair<std::string,std::string> pair;
while (std::getline(myReadFile, pair.first , ','))
{
std::getline(myReadFile, pair.second);
startTape.push_back(pair);
}
myReadFile.close();
startTape {size = 8}
std::pair<std::string,std::string> firstCompare = startTape.front();
startTape.remove(*startTape.begin());
std::pair<std::string,std::string> secondCompare = startTape.front();
startTape.remove(*startTape.begin());
startTape {size = 1753706592}
当我查看startTape列表时,它似乎已经循环播放。
(readFile内容如下) N,C / n 我,G / n A,U / n H,A / n G,M / n C,I / n S,H / n U,N / n
答案 0 :(得分:1)
我写了一个完整的程序,其中包含您上面提到的所有内容 我确实改变了稍微读取文件的方式 - 我不熟悉你调用getline()的方式,其中第一个参数是流名称,所以我创建了一个字符缓冲区来读取各个元素,然后复制它们这对。我还确保我不会在文件的末尾做一些疯狂的事情,以防没有读取两个元素(无论文件末尾是否有\ n,它都能正常工作)。
#include <fstream>
#include <iostream>
#include <list>
#define BUF 100
using namespace std;
int main() {
std::ifstream myReadFile;
std::list<std::pair<std::string,std::string> > startTape;
std::pair<std::string,std::string> pair;
char sbuf[BUF]; // temp storage for file read
myReadFile.open("listOwords.txt");
if(!myReadFile) {
cerr << "Error: file could not be opened" << endl;
exit(1);
}
cout << "file opened successfully" << endl;
while(myReadFile.getline(sbuf, BUF, ',')) {
pair.first = sbuf;
myReadFile.getline(sbuf, BUF);
pair.second = sbuf;
if(myReadFile.good()) {
// only process if both elements were read successfully
// this deals with the problem of a "half pair" being read if the file is terminated with \n
startTape.push_back(pair);
cout << "read a pair: " << pair.first << ", " << pair.second << endl;
}
}
myReadFile.close();
cout << "Size of startTape is now " << startTape.size() << endl;
std::pair<std::string,std::string> firstCompare = startTape.front();
startTape.remove(*startTape.begin());
cout << "Size of startTape is now " << startTape.size() << endl;
std::pair<std::string,std::string> secondCompare = startTape.front();
startTape.remove(*startTape.begin());
cout << "Size of startTape is now " << startTape.size() << endl;
exit(0);
}
listOwords的内容:
>cat listOwords.txt
N, C
I, G
A, U
H, A
G, M
C, I
S, H
U, N
我得到的输出是:
file opened successfully
read a pair: N, C
read a pair: I, G
read a pair: A, U
read a pair: H, A
read a pair: G, M
read a pair: C, I
read a pair: S, H
read a pair: U, N
Size of startTape is now 8
Size of startTape is now 7
Size of startTape is now 6
如果您使用这个确切的代码得不到相同的结果,请告诉我?
答案 1 :(得分:0)
我认为您认为列表方向错误。列表的“顶部”是“后退”(push_back,pop_back)或“结束”(rbegin)。
尝试使用back()而不是front(),并使用pop_front()删除第一个元素。
但是,列表大小的变化就像那个声音更像某个地方的错误。