0% нашли этот документ полезным (0 голосов)
1 просмотров37 страниц

CPP 9

Документ описывает методы отладки и контейнерные классы в технологии объектно-ориентированного программирования (ООП) с использованием библиотеки Qt. Он охватывает различные типы контейнеров, такие как последовательные (QVector, QList) и ассоциативные (QMap, QSet), а также методы работы с ними и алгоритмы. Также рассматриваются итераторы и их использование для перебора элементов контейнеров.

Загружено:

e102.gamma
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
1 просмотров37 страниц

CPP 9

Документ описывает методы отладки и контейнерные классы в технологии объектно-ориентированного программирования (ООП) с использованием библиотеки Qt. Он охватывает различные типы контейнеров, такие как последовательные (QVector, QList) и ассоциативные (QMap, QSet), а также методы работы с ними и алгоритмы. Также рассматриваются итераторы и их использование для перебора элементов контейнеров.

Загружено:

e102.gamma
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd

Технология ООП

Санкт-Петербургский государственный политехнический университет

8 ноября 2011

Технология ООП
Методы отладки

отладчик
QObject::dumpObjectInfo()
Q_ASSERT() — выводит предупреждение, если не равно
true
Q_CHECK_PTR() — проверяет указатель на NULL
qDebug(), qWarning(), qFatal()

Технология ООП
Методы отладки

В процессе отладки рекомендуется присваивать объектам


имена при помощи функции QObject::objectName()
qDebug ( ) << "Test" << Q S t r i n g ( " S t r i n g " ) << QChar ( ’ x
’ ) << QRect ( 0 , 1 0 , 5 0 , 4 0 ) ;

qDebug ( "%d" , i " ) ;

Технология ООП
Глобальные определения

Содержатся в заголовочном файле QtGlobal


qMax, qMin
qAbs, qRound
i n t max = qMax<i n t >(3 , 5 ) ;
i n t a b s = qAbs ( −5) ;
i n t r n d = qRound ( −5.2) ;

Технология ООП
Глобальные определения

Типы Qt
qint8, qunit8
...
qint64, quint64
qlonglong
qulonglong

Технология ООП
Контейнерные классы

Последовательные и ассоцитивные.
Последовательные:
QVector<T>
QList<T>
QLinkedList<T>
QStack
QQueue

Технология ООП
Контейнерные классы

Ассоциативные:
QSet<T>
QMap<K,T>
QMultiMap<K,T>
QHash<K,T>
QMultiHash<K,T>

Технология ООП
Контейнерные классы

Во всех контейнерных классах переопределены операции:


== !=
=
[] , кроме QSet
begin() end()
clear()
insert()
remove()
size() count()
value() , кроме QSet
empty isEmpty()

Технология ООП
Итераторы

Java Style:
Q L i s t <Q S t r i n g > l i s t ;
Q L i s t I t e r a t o r <Q S t r i n g > i t ( l i s t ) ;
w h i l e ( i t . h a s N e x t ( ) ) { qDebug ( ) << i t . n e x t ( ) ; }

Если необходимо изменять значения списка то для этого надо


воспользоваться QMutableListIterator’ом.

Технология ООП
Итераторы

Java Style:
Q L i s t <Q S t r i n g > l i s t ;
Q M u t a b l e L i s t I t e r a t o r <Q S t r i n g > i t ( l i s t ) ;
w h i l e ( i t . h a s N e x t ( ) ) { i f ( i t . n e x t ( ) == " t e s t " ) { i t .
s e t V a l u e ( "new" ) ; } }

Технология ООП
Итераторы

STL Style:
Q L i s t <Q S t r i n g > l i s t ;
Q L i s t <Q S t r i n g > : : i t e r a t o r i t = l i s t . b e g i n ( ) ;
f o r ( ; i t != v e c . end ( ) ; i t ++)
{ qDebug ( ) << "Element␣ i s ␣" << ∗ i t }

Технология ООП
Итераторы

Если не планируется изменять значения элементов, то


эффективнее использовать const_iterator;
Q L i s t <Q S t r i n g > l i s t ;
Q L i s t <Q S t r i n g > : : c o n s t _ i t e r a t o r i t = l i s t . c o n s t B e g i n
() ;
f o r ( ; i t != v e c . c o n s t E n d ( ) ; i t ++)
{ qDebug ( ) << "Element␣ i s ␣" << ∗ i t }

Технология ООП
Итераторы

foreach — макрос который позволяет перебрать элементы


Q L i s t <Q S t r i n g > l i s t ;
f o r e a c h ( Q S t r i n g s t r , l i s t ) { qDebug ( ) << s t r ; }

Технология ООП
Методы последовательных контейнеров

+
+= «
at()
back() last()
front() first()
contains()
indexOf()
lastIndexOf()
push_back() append()
push_front() prepend()

QVector<Q S t r i n g > v e c ;
v e c . append ( " s t r i n g " ) ;

Технология ООП
QVector

Представляет собой динамический массив. Вставка в начало и


в середину происходят за время O(n), в конец массива может
выполняться за время O(1).
data()
resize()
reserve()
QVector<Q S t r i n g > v e c ;
v e c . push_back ( " s t r i n g " ) ;
v e c . push_back ( " s t r i n g 2 " ) ;
v e c . push_back ( " s t r i n g 3 " ) ;

Технология ООП
QList

Представляет собой упорядоченный набор связанных друг с


другом элементов. Поиск выполняется за время O(1), вставка в
середину за O(n), вставка вначало или конец списка как
правило за O(1), эти времена достиаются за счет того что
внутри QList реализован на базе массива.
swap()
move()
takeAt()
Q L i s t <Q S t r i n g > l s t ;
l s t << " s t r 1 " << " s t r 2 " ;
Q L i s t <Q S t r i n g > : : i t e r a t o r i t ;
f o r ( i t = l s t . b e g i n ( ) ; i t != l s t . end ( ) ; ++i t )
{ qDebug ( ) << ∗ i t ; }

Технология ООП
QLinkedList

Двусвязный список. Вставка в любое место списка выполняется


за время O(1), поиск за O(n).
Q L i n k e d L i s t <Q S t r i n g > l s t ;
l s t << " s t r 1 " << " s t r 2 " ;
Q L i n k e d L i s t <Q S t r i n g > : : i t e r a t o r i t ;
f o r ( i t = l s t . b e g i n ( ) ; i t != l s t . end ( ) ; ++i t )
{ qDebug ( ) << ∗ i t ; }

Технология ООП
QStack

Стек — реализует структуру данных, работающую по принципу


LIFO. Наследуется от QVector’a.
push()
pop()
top()
QStack<i n t > s t a c k ;
s t a c k . push ( 1 ) ;
s t a c k . push ( 2 ) ;
s t a c k . push ( 3 ) ;
while ( ! s t a c k . isEmpty ( ) )
c o u t << s t a c k . pop ( ) << e n d l ;

Технология ООП
QQueue

Стек — реализует структуру данных, работающую по принципу


FIFO. Наследуется от QList’a.
enqueue()
dequeue()
head()
QQueue<i n t > queue ;
queue . e n q u e u e ( 1 ) ;
queue . e n q u e u e ( 2 ) ;
queue . e n q u e u e ( 3 ) ;
w h i l e ( ! queue . i s E m p t y ( ) )
c o u t << queue . d e q u e u e ( ) << e n d l ;

Технология ООП
Ассоциативные контейнеры

Для всех контейнеров этого типа доступны методы:


contains()
erase()
find()
insert() отсутствует в QSet
insertMulti() отсутствует в QSet
key() отсутствует в QSet
value() отсутствует в QSet
keys() отсутствует в QSet
values()

Технология ООП
QMap<K,T> QMultiMap<K,T>

Словари хранят элементы одного и того же типа,


индексируемые ключевыми значениями, в QMap — ключи
должны быть уникальны в отличии от QMultiMap (элементы
словаря отсортированы по ключу). Вставка и поиск элементов
осуществляются за время O(log n).

Технология ООП
QMap<K,T> QMultiMap<K,T>

QMap<Q S t r i n g , i n t > map


map [ "one" ] = 1 ;
map [ " t h r e e " ] = 3 ;
map [ " seven " ] = 7
map . i n s e r t ( " twelve " , 1 2 ) ;
i n t num1 = map [ " t h i r t e e n " ] ;
i n t num2 = map . v a l u e ( " t h i r t e e n " ) ;
QMap<Q S t r i n g , i n t > : : i t e r a t o r i t = map . b e g i n ( ) ;
f o r ( ; i t != map . end ( ) ; i t ++)
{
qDebug << i t . k e y ( ) << i t . v a l u e ( ) ;
}
i f ( map . c o n t a i n s ( "one" ) ) { qDebug << "one" ; }

Технология ООП
QMap<K,T> QMultiMap<K,T>

Если необходимо связать с одним ключем несколько значений,


например, в адресной книге, то необходимо использовать
структуру QMultiMap.
QMultiMap<Q S t r i n g , i n t > map
map . i n s e r t ( " twelve " , 1 2 ) ;
map . i n s e r t ( " twelve " , 1 3 ) ;
QMap<Q S t r i n g , i n t > : : i t e r a t o r i t = map . f i n d ( " twelve
") ;
f o r ( ; i t != map . end ( ) && i t . k e y ( ) == " twelve " ; i t
++)
{
qDebug << i t . k e y ( ) << i t . v a l u e ( ) ;
}
i f ( map . c o n t a i n s ( "one" ) ) { qDebug << "one" ; }

Технология ООП
QHash<K,T>
В отличии от словарей не используют сортировку по ключу, а
исполюзует хэш-таблицу, что позволяет работать с этой
коллекцией намного быстрее. Время доступа к элементам O(1),
в худшем случае O(n), время вставки элемента O(1), в худшем
случае O(n).
При использовании оператора [], как для QHash так и для
QMap следует учитывать, что если при сравнении элемент не
обнаружен он будет создан.
QHash<Q S t r i n g , i n t > h a s h ;
h as h . i n s e r t ( " twelve " , 1 2 ) ;
h as h . i n s e r t ( " twelve " , 1 3 ) ;
QHash<Q S t r i n g , i n t > : : i t e r a t o r i t = h a s h . f i n d ( "
twelve " ) ;
f o r ( ; i t != h a s h . end ( ) && i t . k e y ( ) == " twelve " ;
i t ++)
{
qDebug << i t . k e y ( ) << i t . v a l u e ( ) ;
}
i f ( h a s h . c o n t a i n s ( "one" ) ) { Технология
qDebugООП<< "one" ; }
QHash<K,T>

Для создания коллекции из собственных классов, необходимо


переопределить оператор == и специализированную функцию
qHash, которая должна возвращать уникальное число для
каждого находящегося в хеше элемента.

Технология ООП
QSet<T>

Является частным случаем таблицы QHash, хранит внутри себя


только ключи без значений. Позволяет выполнять операции
над множествами, такие как объединение, пересечение,
разность.
intersect()
subtract()
toList()
unite()

Технология ООП
QSet<T>

QSet<Q S t r i n g > s e t 1 ;
QSet<Q S t r i n g > s e t 2 ;
s e t 1 << " s t r 1 " ;
s e t 2 << " s t r 2 " ;
set1 . unite ( set2 ) ;
set1 . i n t e r s e c t ( set2 ) ;

Технология ООП
Алгоритмы

Входят в заголовочный файл QtAlgorithms и предоставляют


операции применяемые к контейнерам.
qBinaryFind()
qCopy()
qCopyBackward()
qCount()
qDeleteAll()
qEqual()
qFill()
qFind()
qLowerBound()
qUpperBound()
qSwap()

Технология ООП
qSort

Для функции qSort необходимо чтобы были переопределены


операторы сравнения строк.
Q L i s t <i n t > l i s t ;
l i s t << 33 << 12 << 68 << 6 << 1 2 ;
q S o r t ( l i s t . b e g i n ( ) , l i s t . end ( ) ) ;
// l i s t : [ 6 , 1 2 , 1 2 , 3 3 , 68

Технология ООП
qFind

Отвечает за поиск элементов в коллекции, возвращает


итератор установленный на первый найденый элемент.
QStringList l i s t ;
l i s t << "one" << "two" << " t h r e e " ;

Q S t r i n g L i s t : : i t e r a t o r i 1 = qFind ( l i s t . begin ( ) ,
l i s t . end ( ) , "two" ) ;
// i 1 == l i s t . b e g i n ( ) + 1

Q S t r i n g L i s t : : i t e r a t o r i 2 = qFind ( l i s t . begin ( ) ,
l i s t . end ( ) , " seventy " ) ;
// i 2 == l i s t . end ( )

Технология ООП
qEqual

Позволяет сравнить две коллекции различных типов, например


QList и QVector. В качестве первого и второго параметра
передаются итераторы указывающие на начало и конец первой
последовательности, а в качестве третьего итератор на начало
второй последовательности.

Технология ООП
qEqual

QStringList l i s t ;
l i s t << "one" << "two" << " t h r e e " ;

QVector<Q S t r i n g > v e c t ( 3 ) ;
v e c t [ 0 ] = "one" ;
v e c t [ 1 ] = "two" ;
v e ct [ 2 ] = "three" ;

bool r e t 1 = q E q u a l ( l i s t . b e g i n ( ) , l i s t . end ( ) , v e c t .
begin () ) ;
// r e t 1 == t r u e

v e c t [ 2 ] = " seven " ;


bool r e t 2 = q E q u a l ( l i s t . b e g i n ( ) , l i s t . end ( ) , v e c t .
begin () ) ;
// r e t 2 == f a l s e

Технология ООП
qFill

Заполнить коллекцию какими-либо заданными значениями.


QStringList l i s t ;
l i s t << "one" << "two" << " t h r e e " ;

q F i l l ( l i s t . b e g i n ( ) , l i s t . end ( ) , " e l e v e n " ) ;


// l i s t : [ " e l e v e n " , " e l e v e n " , " e l e v e n " ]

q F i l l ( l i s t . b e g i n ( ) + 1 , l i s t . end ( ) , " s i x " ) ;


// l i s t : [ " e l e v e n " , " s i x " , " s i x " ]

Технология ООП
Регулярные выражения
Описываются классом QRegExp, представляют из себя шаблон
который предназначен для поиска текста в строке.
. // a . b
^ и $ //^Abc$
[ ] // [ abc ]
− // [0 −9A−Za−z ]
^ // [^ d e f ]
∗ //A∗b
+ //A+b
? //A? b
{n} //A{3} b
{n , } // a { 3 , } b
{ , n} // a { , 3 } b
{n ,m} // a { 2 , 3 } b
| // ac | bc
\b // a \b
\B // a \Bd

Технология ООП
Регулярные выражения

( ) // ( ab | ac ) ad
\d // q\d // q2
\D // a \D // ad
\ s //
\S // a
\w // c
\W // 2

QRegExp r e g ( "
[0 −9]{1 ,3}\\.[0 −9]{1 ,3}\\.[0 −9]{1 ,3}\\.[0 −9]{1 ,3}
") ;
Q S t r i n g s t r ( "my␣ i p ␣ a d d r e s s ␣ i s ␣ 1 9 2 . 1 6 8 . 0 . 1 ␣" ) ;
qDebug ( ) << s t r . c o n t a i n s ( r e g ) : 1 ? 0 ;
QRegExp r x ( "^\\d\\d?$" ) ;
r x . i n d e x I n ( "123" ) ;
r x . i n d e x I n ( "−6" ) ;
r x . i n d e x I n ( "6" ) ;

Технология ООП
Регулярные выражения

QRegExp r x ( "^\\S+$" ) ;
r x . i n d e x I n ( " H e l l o ␣ world " ) ;
r x . i n d e x I n ( " This_is−OK" ) ;

QRegExp r x ( "\\b ( m ail | l e t t e r | correspondence ) \\b" ) ;


r x . i n d e x I n ( " I ␣ s e n t ␣you␣an␣ email " ) ; // r e t u r n s
−1 ( no match )
r x . i n d e x I n ( " Please ␣ w r i t e ␣ the ␣ l e t t e r " ) ; // r e t u r n s
17

QRegExp r x ( " ∗ . html" ) ;


r x . s e t P a t t e r n S y n t a x ( QRegExp : : W i l d c a r d ) ;
r x . e x a c t M a t c h ( " i n d e x . html" ) ;
r x . e x a c t M a t c h ( " d e f a u l t . htm" ) ;
r x . e x a c t M a t c h ( "readme . t x t " ) ;

Технология ООП
Объект QVariant

Позволяет хранить объекты произвольных типов.


QVariant v (123) ;
int x = v . toInt () ;
v = QVariant (" h e l l o ") ;
int y = v . toInt () ;
QString s = v . t o S t r i n g () ;

Технология ООП

Вам также может понравиться