我想使用QTextStream直接填充QList。 我有这个代码正常工作:
reader
我想知道为什么在取消注释时(和read1>> aux; str.append(aux);注释),while循环中的注释代码无法正常工作。我可以使用它,但str.count()返回0并且str.isEmpty为true,即使我可以使用str.at(i)读取值。
我还有另一种解决方案,比如评论我不需要使用辅助变量aux?
答案 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++];
并保存一行代码。