顺序容器(Sequential Containers)

链表,队列,数组都是顺序容器。最常用的顺序容器是QList类。它是一个模板类,需要一个类型才能被初始化。它也是隐式共享的,数据存放在堆中。所有的容器类应该被创建在栈上。正常情况下你不需要使用new QList<T>()这样的语句,千万不要使用new来初始化一个容器。

QList与类QString一样强大,提供了方便的接口来查询数据。下面一个简单的示例展示了如何使用和遍历链表,这里面也使用到了一些C++11的新特性。

  1. // Create a simple list of ints using the new C++11 initialization
  2. // for this you need to add "CONFIG += c++11" to your pro file.
  3. QList<int> list{1,2};
  4. // append another int
  5. list << 3;
  6. // We are using scopes to avoid variable name clashes
  7. { // iterate through list using Qt for each
  8. int sum(0);
  9. foreach (int v, list) {
  10. sum += v;
  11. }
  12. QVERIFY(sum == 6);
  13. }
  14. { // iterate through list using C++ 11 range based loop
  15. int sum = 0;
  16. for(int v : list) {
  17. sum+= v;
  18. }
  19. QVERIFY(sum == 6);
  20. }
  21. { // iterate through list using JAVA style iterators
  22. int sum = 0;
  23. QListIterator<int> i(list);
  24. while (i.hasNext()) {
  25. sum += i.next();
  26. }
  27. QVERIFY(sum == 6);
  28. }
  29. { // iterate through list using STL style iterator
  30. int sum = 0;
  31. QList<int>::iterator i;
  32. for (i = list.begin(); i != list.end(); ++i) {
  33. sum += *i;
  34. }
  35. QVERIFY(sum == 6);
  36. }
  37. // using std::sort with mutable iterator using C++11
  38. // list will be sorted in descending order
  39. std::sort(list.begin(), list.end(), [](int a, int b) { return a > b; });
  40. QVERIFY(list == QList<int>({3,2,1}));
  41. int value = 3;
  42. { // using std::find with const iterator
  43. QList<int>::const_iterator result = std::find(list.constBegin(), list.constEnd(), value);
  44. QVERIFY(*result == value);
  45. }
  46. { // using std::find using C++ lambda and C++ 11 auto variable
  47. auto result = std::find_if(list.constBegin(), list.constBegin(), [value](int v) { return v == value; });
  48. QVERIFY(*result == value);
  49. }