我有一个5行的QString
“AAAAAR”
“BBBBB”
“CCCRC”
“DDDDD”
“EEEEE”
我想只用2到4行搜索“R”字符。如果其中一个内容为'R',则从我的QString中删除该行
我尝试了很多方法但没有成功。
答案 0 :(得分:2)
您可以拆分每一行的字符串,为其提供一个包含5个字符串的QStringList
。然后从2迭代到4,如果字符串包含R
,则从字符串列表中删除字符串,最后再加入字符串列表。
QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
QStringList l = s.split('\n');
int i = 1, stop = 4;
while (i < stop) {
if (!l[i].contains('R')) ++i;
else {
l.removeAt(i);
--stop;
}
}
s = l.join('\n');
此解决方案应该更灵活,无论输入如何都可以工作,只需选择您想要签入的范围。
具有讽刺意味的是,如果循环反向迭代,则留下空洞并跟踪总计数是没有问题的。
for (int i = 3; i > 0; --i) if (l[i].contains('R')) l.removeAt(i);
答案 1 :(得分:0)
与ddriver的解决方案类似,但使用迭代器
#include <QApplication>
#include <QString>
#include <QStringList>
#include <QtCore>
int main(int argc, char** argv)
{
QApplication app(argc,argv);
QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
QStringList l = s.split('\n');
for( QStringList::iterator it = ++l.begin(); it != --l.end(); ) {
if( it->contains('R') ) {
it = l.erase(it);
} else {
++it;
}
}
s = l.join("\n");
qDebug() << l;
return app.exec();
}
输出:
("AAAAAR", "BBBBB", "DDDDD", "EEEEE")
我不会在for
循环中使用增量,而是使用
QList::erase(iterator pos)
Removes the item associated with the iterator pos from the list, and returns an iterator to the next item in the list
。
我更多地假设你想要从第二个元素循环到第二个元素,不管元素的数量是多少。
编辑:如果你想移动容器中的特定元素,你可以例如使用std::advance
#include <QApplication>
#include <QString>
#include <QStringList>
#include <QtCore>
#include <iterator>
int main(int argc, char** argv)
{
QApplication app(argc,argv);
QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
QStringList l = s.split('\n');
QStringList::iterator it = l.begin();
QStringList::iterator itEnd = l.begin();
std::advance(it,2); // set the number to whatever start position you want
std::advance(itEnd,4); // set the number to whatever end position you want
for( ; it != itEnd ; ) {
if( it->contains('R') ) {
it = l.erase(it);
} else {
++it;
}
}
s = l.join("\n");
return app.exec();
}