上次我们遇到了形如 QList<QStringList> rows 的看起来古怪的表达方式。
当然了,看起来古怪主要是因为我的C++学的不好啊,然后我就查了一下手头的书《21天学通C++第六版》,在其258页,15.4节,进行了“模板简介”的讲解。
顺带的,在QT Creator里,在QList上按下F1查看帮助文档。
这顺序其实应该是先看了帮助文档,发现这是一个QList<T>的东西,然后才知道这个东西长的跟模板有关系,然后才去找的书,然后才发现还有函数模板,然后才确定这是类模板……
模板类,类模板@@,好吧它们之间或许真的有语意上的细微区别,但是我是目前理解它们是一样的了。书上说道“模板类是模板化的C++类”,然后给出了一个例子:
template <typename T> class CMyFirstTemplateClass { public: void SetVariable(T& newValue) {m_Value = newValue;}; T& GetValue(){return m_Value;}; private: T m_Value; };
是吧,有例子就比没有例子强啊,而且这里有一点,模板之前讲的是宏定义,而且说了,宏函数不是类型安全的,模板则是安全的,因此模板就有了跟宏相似的地方——替换。
先说一下这个例子,这个例子使用的时候比如是CMyFirstTemplate<int>abcd; 这个int就替换掉了声明里面的T,因此这个T就是个类似未知数变量之类的东西了,打酱油的。
如此说来我们用到的QList<QStringList>就是把QList中的类型指定为QStringList了。
然后看看QT的帮助文档,上面说道:
QList类是一个模板类,提供了列表。
QList<T>是QT的普通容器类的一种。它存储了一个值的列表,并且提供了基于索引的快速访问,插入,删除等。
然后文档中列出了QList<T>,QLinkedList<T>,QVector<T>三种之间的相同点和不同点,分析优越性啊什么的。
不过目前我还没有关注那么远,就知道平常使用QList就很好了。
帮助文档给出了一些例子:
QList<int> integerList; 存储的整数
QList<QData> dateList; 存储的QDate类型的值
然后就提到了我们用到的那种方式
Qt包含了一个QStringList类,继承了QList<QString>并且添加了一些方便操作的函数,比如QStringList::join() QStringList::find() 等等。
帮助文档继续说到
QList存储了一个条目的列表,默认的构造函数创建了一个空的列表。为了插入条目,可以使用操作符<<();
然后举例子:
QList<QString> list;
list << "one" << "two" << "three";
然后呢,帮助文档说了一下,提供了一些基础函数insert() replace() removeAt() move() swap(),然后还有 append() prepend() removeFirst() removeLast()
然后又提到了Qlist跟数组一样从0开始数
好吧,后面还有不少内容,但是我看不下去了先……,目前了解的基本够我理解程序的了。就是个字符串数组操作么……@@,搞的如此复杂。
最后给出代码,省的再翻了
QList<QStringList> rows = QList<QStringList>() << (QStringList() << "Verne Nilsen" << "123") << (QStringList() << "Carlos Tang" << "77") << (QStringList() << "Bronwyn Hawcroft" << "119") << (QStringList() << "Alessandro Hanssen" << "32") << (QStringList() << "Andrew John Bakken" << "54") << (QStringList() << "Vanessa Weatherley" << "85") << (QStringList() << "Rebecca Dickens" << "17") << (QStringList() << "David Bradley" << "42") << (QStringList() << "Knut Walters" << "25") << (QStringList() << "Andrea Jones" << "34");