Подобное копирование контейнера может показаться неэффективным, но это не так из-за оптимизации посредством так называемого
Привлекательность неявного совместного использования данных заключается в том, что эта оптимизация выполняется так, что мы можем не думать о ней; она просто работает сама по себе и не требует от нас какого-то дополнительного программного кода. В то же время неявное совместное использование данных способствует тому, что программист следует четкому стилю, возвращая все объекты по значению. Рассмотрим следующую функцию:
01 QVector
02 {
03 QVector
04 for (int i = 0; i <360; ++i)
05 vect[i] = sin(i / (2 * M_PI));
06 return vect;
07 }
Вызов этой функции выглядит следующим образом:
QVector
В отличие от этого подхода, STL склоняет нас к передаче вектора в виде неконстантной ссылки, чтобы избежать копирования, происходящего из-за возвращения функцией значения, хранимого в переменной:
01 using namespace std;
02 void sineTable(vector
03 {
04 vect.resize(360);
05 for (int i = 0; i < 360; ++i)
06 vect[i] = sin(i / (2 * M_PI));
07 }
В результате вызов будет не столь простым и менее понятным:
vector
sineTable(table);
В Qt применяется неявное совместное использование данных во всех ее контейнерах и во многих других классах, включая
Неявное совместное использование данных в Qt гарантирует, что данные не будут копироваться, если мы их не модифицируем. Чтобы получить максимальные выгоды от применения этой технологии, необходимо выработать в себе две новые привычки при программировании. Одна связана с использованием функции
Подобная проблема возникает при прохождении контейнера с помощью итераторов в стиле STL. Когда вызываются функции
В Qt предусмотрен еще один, последний метод прохода по элементам последовательного контейнера — оператор цикла
QLinkedList
…
foreach (Movie movie, list) {
if (movie.title == "Citizen Kane") {
cout << "Found Citizen Kane" << endl;
break;
}
}
Псевдоключевое слово
Поддерживаются операторы цикла
QLinkedList
Movie movie;
…
foreach (movie, list) {
if (movie.title == "Citizen Kane") {
cout << "Found Citizen Kane" << endl;
break;
}
}
Определение переменной цикла вне цикла — единственная возможность для контейнеров, содержащих типы данных с запятой (например,