【发布时间】:2015-04-19 11:27:38
【问题描述】:
我有一个 5 行的 QString
“AAAA”
“BBBBB”
“CCCRC”
“DDDDD”
“EEEEE”
我只想用 2 到 4 行搜索“R”字符如果其中一个内容为“R”,则从我的 QString 中删除该行
我尝试了很多方法,但都没有成功。
【问题讨论】:
-
显示您下次尝试的内容...
标签: qt
我有一个 5 行的 QString
“AAAA”
“BBBBB”
“CCCRC”
“DDDDD”
“EEEEE”
我只想用 2 到 4 行搜索“R”字符如果其中一个内容为“R”,则从我的 QString 中删除该行
我尝试了很多方法,但都没有成功。
【问题讨论】:
标签: qt
你可以为每一行分割字符串,给你一个QStringList,里面有5个字符串。然后从 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);
【讨论】:
l.removeAt(i);,您将立即缩短列表,因此下一次迭代将检查EEEEE,而不是DDDDD。此外,如果您有<3,那么您实际上只检查1 和2 而不是列表中的元素2-4
AAAAAR\nBBBBB\nDDDDD\nCCCRC\nEEEEE 作为字符串而不是原始字符串传递,则您的代码在第四个位置时找不到匹配项。只需将 < 3 更改为 `
AAAAAR\nBBRBB\nDDRDD\nCCCCC\nEEEEE 一起崩溃。我想我将不得不使用不止一行,因为我不想这样做:)
类似于 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();
}
【讨论】: