- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Qt 容器类之遍历器和隐式数据共享
Qt 容器类之遍历器和隐式数据共享
Qt 容器类之遍历器和隐式数据共享
前⾯说过,Qt 容器类提供了两种遍历器:Java 风格的和 STL 风格的。前者⽐较容易
使⽤,后者则可以⽤ ⼀些通过算法中,功能⽐较强⼤。
对于每⼀个容器类,都有与之相对应的遍历器:只读遍历器和读写遍历器。只读遍历
器有QVectorIterator ,QLinkedListIterator和 QListIterator三种;读写遍历器同样也有三
种,只不过名字中具有⼀个 Mutable ,即 QMutableVectorIterator ,
QMutableLinkedListIterator和 QMutableListIterator 。这⾥我们只讨论 QList 的遍历器,
其余遍历器具有⼏乎相同的API 。
Java 风格的遍历器的位置如下图所⽰(出⾃ C++ GUI Pro rammin with Qt4 , 2nd
Edition) :
可以看出,Java 风格的遍历器,遍历器不指向任何元素,⽽是指向第⼀个元素之前、
两个元素之间或者是最后⼀个元素之后的位置。使⽤ Java 风格的遍历器进⾏遍历的典
型代码是:
QListdouble list;
// ...
QListIteratordouble i(list);
while (i.hasNext()) {
doSomething ith(i.next());
}
这个遍历器默认指向第⼀个元素,使⽤ hasNext()和 next()函数从前向后遍历。你也可
以使⽤ toBack()函数让遍历器指向最后⼀个元素的后⾯的位置,然后使⽤
hasPrevious()和 previous()函数进⾏遍历。
这是只读遍历器,⽽读写遍历器则可以 遍历的时候进⾏增删改的操作,例如:
QMutableListIteratordouble i(list);
while (i.hasNext()) {
if (i.next() 0.0)
i.remove();
}
当然,读写遍历器也是可以从后向前遍历的,具体 API 和前⾯的⼏乎相同,这⾥就不
再赘述。
对应于 Java 风格的遍历器,每⼀个顺序容器类 C都有两个 STL 风格的遍历器:
C::iterator和 C::const_iterator 。正如名字所暗⽰的那样,const_iterator 不允许我们对遍
历的数据进⾏修改。be in()函数返回指向第⼀个元素的 STL 风格的遍历器,例如
list[0] ,⽽ end()函数则会返回指向最后⼀个之后的元素的 STL 风格的遍历器,例如如
果⼀个 list 长度为5 ,则这个遍历器指向 list[5] 。下图所⽰ STL 风格遍历器的合法位
置:
如果容器是空的,be in()和 end()是相同的。这也是⽤于检测容器是否为空的⽅法之
⼀,不过调⽤isEmpty()函数会更加⽅便。
STL 风格遍历器的语法类似于使⽤指针对数组的操作。我们可以使⽤++和--运算符使
遍历器移动到下⼀位置,遍历器的返回值是指向这个元素的指针。例如 QVector 的
iterator 返回值是 T 类型,⽽ const_iterator 返回值是 const T 类型。
⼀个典型的使⽤ STL 风格遍历器的代码是:
QListdouble::iterator i = list.begin();
while (i != list.end()) {
*i = qAbs(*i);
++i;
}
对于某些返回容器的函数⽽⾔,如果需要使⽤ STL 风格的遍历器,我们需要建⽴⼀个
返回值的拷贝,然后再使⽤遍历器进⾏遍历。如下⾯的代码所⽰:
QListint list = splitter-sizes();
QListint::const_iterator i = list.begin();
while (i != list.end()) {
doSomething(*i);
++i;
}
⽽如果你直接使⽤返回值,就像下⾯的代码:
// RONG
QListint::const_iterator i = splitter-sizes().begin();
while (i != splitter-sizes
文档评论(0)