2016-08-18 615 views
0

我目前正在研究一个小程序,其中我将计算文本中提及某个单词的次数。但是我只想在上一个元素是一个10位数的时候计算这个单词。 所以我想要做的是我会检查迭代器的前一个元素是否包含一个10位数字。但我不知道如何迭代迭代器中的前一个元素。获取QStringList的前一个元素

QString input = ui->listinput->toPlainText(); 

QStringList inputlist = input.split(QRegExp("[\s\n\r " "]+")); 

unsigned int boxCount(0); 

for(QStringList::iterator it(inputlist.begin()); it != inputlist.end(); ++it){ 

    if(!QString::compare(*it,box)) ++boxCount; 

} 

所以我想,如果语句是这样的:

if(!QString::compare(*it,box) && *prev_it == 10 digits) ++boxCount; 

任何帮助将不胜感激。谢谢!

+1

使用索引可能会更简单。请注意,列表中的第一个字符串没有以前的字符串,所以您希望从第二个项目开始循环。 – hyde

+0

顺便说一句,如果我看到事情正确的方式,你不改变列表中的元素,所以@hyde提到使用索引是一种简单的方法,除了使用'at(...)'将是正确的路要走因为'at(...)'返回一个只能被读取的'const'(基本上这就是你在这里做的)。迭代器允许读写。无需暴露足够的“只读”来写入访问权限。 – rbaleksandar

+0

如果您手动修补它,通过循环迭代的优点在边界检查方面会消失。我提到这一点是因为'at(...)'(我最近才发现)不检查是否出界。 – rbaleksandar

回答

2

您可以通过执行获得先前的迭代器:

if (it != inputlist.begin()) { 
    prev_it = it - 1 
} 

你将不得不破例为第一要素,因为它没有一个元素。无论是检查范围(如上述)或过去的第一启动for一种元素(注意“+ 1”):

for (QStringList::iterator it(inputlist.begin() + 1); it != inputlist.end(); ++it) { 
    ... 
} 

在后一种情况下,你必须在你的列表中包含至少一个可以肯定的元件。

然后,如果您要检查,如果数字是10位(假设十进制和整数),您可以尝试以下方法:

bool ok = false; 
long num = prev_it->toLong(&ok); 
if (ok && num >= 1000000000) { 
    // do something 
} 

注:我用long类型,因为我不知道的范围内的数字,但他们似乎很大。

+0

不要忘记先检查范围。 –

+0

你应该检查'it-1'是否不会降低一个元素。虽然'for'循环确保你不会超出列表的范围,改变里面的迭代器需要额外的检查。否则,我们可以执行'it = it + 1000',然后执行一些操作,将迭代器的值作为10个项目的列表,并希望应用程序不会崩溃或创建某种可能实际上保持不可见的内存损坏问题引起很多头痛。 – rbaleksandar

+0

@SimonKraemer新增范围检查 –