0

我想直接使用 QTextStream 填充 QList。我有这个代码工作正常:

QList<int> str;

QFile file_read1("C:/Programs/file.txt");
if(file_read1.open(QFile::ReadOnly))
{
    QTextStream read1(&file_read1);
    read1.seek(0);
    int i=0;
    int aux=0;
    while (!read1.atEnd())
    {
        read1>>aux;
        str.append(aux);
        //read1>>str[i];  //I'd like to use something like this
        //i++;
    }
}

return a.exec();
}

我想知道为什么 while 循环中的注释代码在未注释时无法正常工作(并且 read1>>aux;str.append(aux); 已注释)。我可以使用它,但 str.count() 返回 0 并且 str.isEmpty 为真,即使我可以使用 str.at(i) 读取值。

我有另一种解决方案,如评论中的我不需要使用辅助变量 aux 吗?

4

1 回答 1

1
//read1>>str[i];  //I'd like to use something like this

是的,您可以,T & QList::operator[](int i)在您的情况下返回一个int &,这正是流输出运算符所需要的。但是你需要在列表中有足够的空间,因为不像操作append()[]不会增加列表的大小,尝试访问一个无效的索引和你的应用程序崩溃。这就是为什么 count 为 0 并且isEmpty是正确的。能够从中读取是一个幸运的巧合,并且可能是未定义的行为。

不幸的是,QList没有resize()方法,也没有可以设置大小的构造函数。您仍然可以reserve(),但这只会帮助您避免重新分配。它不会增加列表的大小,只会增加容量,因此就列表而言,即使您保留并且可以使用运算符进行读写[],它的大小也将保持为0。您可以简单地QVector改为. 它既有QVector(int size)构造函数,也有void resize(int size)方法。并且在您的情况下会更有效率,因为QList在两端都保留了容量。QList被发明为一种“万事通”,但在某些情况下它是无用的。

请注意reserve(n),如果您真的打算使用它而不是向量,您仍然可以通过使用和附加 n 个虚拟整数值来有效地调整列表的大小。

template<class T>
void resizeList(QList<T> & list, int newSize) {
    int diff = newSize - list.size();
    T t;
    if (diff > 0) {
        list.reserve(diff);
        while (diff--) list.append(t);
    } else if (diff < 0) list.erase(list.end() + diff, list.end());
}

您还可以read1 >> str[i++];保存一行代码。

于 2015-11-22T22:06:25.017 回答