Qt QTextStream到QList项目

时间:2015-11-22 19:11:00

标签: c++ qt qlist qtextstream

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

reader

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

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

1 个答案:

答案 0 :(得分: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++];并保存一行代码。