template ctypename T>
void DisplayContents (const T& Input)
6 : {
for (auto iElement = Input.cbegin() // auto и cbegin: C++11
8: ; iElement != Input.cend()
9: ; ++ iElement )
10: cout « *iElement « ' ';
1 1 :
cout « endl;
}
14:
int main ()
{
std::list listlntegers;
18
19listlntegers.push_front (10);
20listlntegers.push_front (2011);
21listlntegers.push_back (-1);
Основные операции со списком
|
427
|
:2 listIntegers.push_back (9999);
;з
DisplayContents(listlntegers);
return 0;
}
Результат
2011 10 -1 9999
Анализ
Строки 19-22 демонстрирую т применение методов p u s h _ f r o n t () и p u s h _ b a c k (). Значение, переданное как аргумент методу p u s h _ f r o n t (), вставляется в первую позицию списка, а переданное методу p u sh _ b a c k () — в последнюю . Вывод отображает содержи мое списка (при помощи обобщенного шаблона функции D is p la y C o n te n ts ()), демон стрируя, что элементы хранятся не в порядке вставки.
ВНИМАНИЕ!
|
Возникла ошибка компиляции при использовании ключевого
|
|
слова auto?
|
|
|
|
Функция DisplayContents () в листинге 18.2 использует ключевое слово
|
|
С++11 auto для определения типа итератора в строке 7. Кроме того, она ис
|
|
пользует возвращающие итератор
|
const_iterator функции cbeginO и
|
|
cend(), которые совместимы только со стандартом C++11.
|
|
В этом и последующих примерах для компиляции с использованием компиля
|
|
тора, не совместимого со стандартом С++11, необходимо заменить ключевое
|
|
слово auto явным типом.
|
|
|
Так, функцию DisplayContents () для устаревшего компилятора следует из
|
|
менить, как показано ниже.
|
|
|
template ctypename Т>
|
|
|
void DisplayContents (const T& Input)
|
|
{
|
(T::const_iterator iElement = Input.begin ()
|
|
for
|
|
|
; iElement != Input.end ()
|
|
|
; ++
|
iElement )
|
'
|
|
cout
|
cout «
|
*iElement «
|
|
« endl;
|
|
|
}
|
|
|
|
ПРИМЕЧАНИЕ
|
Функция DisplayContents () в строках 4-13 листинга 18.2 является более
|
|
обобщенной версией метода DisplayVector () из листинга 17.6 (обратите
|
|
внимание на измененный список параметров). Хотя последний работал только
|
для вектора, обобщение типа хранимых в нем элементов обеспечивает дей ствительно обобщенную версию даже для контейнеров разных типов.
Вы можете вызвать версию метода DisplayContents () из листинга 18.2 с вектором или списком в качестве аргумента, и он будет работать прекрасно.
428 ЗАНЯТИЕ 18. Классы двухсвязного иодносвязного списков библиотеки ST-
Вставка в середину списка
Контейнер s t d : : l i s t характеризуется возможностью вставки элементов в середин) коллекции за постоянное время. Для этого применяется его функция-член i n s e r t ().
Функция i n s e r t () класса l i s t доступна в трех формах.
■ Форма 1
iterator insert(iterator pos, const T& x)
Здесь функция i n s e r t () получает позицию вставки как первый параметр и вставляе мое значение как второй. Эта функция возвращает итератор, указывающий на элемент, только что вставленный в список.
■ Форма 2
void insert(iterator pos, size_type n, const T& x)
Эта функция получает позицию вставки как первый параметр, вставляемое значение как последний параметр и количество элементов в переменной п.
■ Форма 3
template
void insert(iterator pos, Inputlterator f, Inputlterator 1)
Эта перегруженная версия — шаблон функции, который получает кроме позиции два итератора ввода, отмечающие границы вставляемой в список коллекции. Обратите вни мание: входной тип, I n p u t l t e r a t o r , — параметрический тип шаблона, а потому мо жет указать на границы любой коллекции, будь то массив, вектор или другой список.
В листинге 18.3 показано применение этих перегруженных версий функции l i s t : : i n s e r t ().
И СТ И Н Г 1 8 .3 . Различные способы вставки элементов в список____________________________
#include
#include
using namespace std;
3:
template
void DisplayContents (const T& Input)
6 : {
for (auto iElement = Input.cbegin() // auto и cbegin: C++11
; iElement != Input.cend()
; ++ iElement )
10: cout « *iElement « '
1 1 :
cout « endl;
}
14:
int main ()
{
list listlntegersl;
18
19// Вставка элементов в начало...
20listlntegersl.insert (listlntegersl.begin (), 2);
Основные операции со списком
|
429
|
listlntegersl.insert (listlntegersl.begin (), 1);
Вставка элементов в конец...
listlntegersl.insert (listlntegersl.end (), 3);
cout « "The contents of list 1 after inserting elements:"
endl;
DisplayContents (listlntegersl);
*а
list listlntegers2;
•О
Вставка 4 элементов с одинаковым значением 0...
22 Iistlntegers2.insert (listlntegers2.begin (), 4, 0) ;
23
|
cout
|
«
|
"The contents of list 2
|
after inserting
|
|
24
|
a value:"
|
2 5
|
cout
|
«
|
listlntegers2.size () «
|
"' elements of
|
|
|
«
|
endl;
|
|
|
2 6 DisplayContents (listlntegers2) ;
2*7
list listlntegers3;
29
// Вставка элементов из другого списка в начало...
Iistlntegers3.insert (listlntegers3.begin (),
42 listlntegersl.begin (), listlntegersl.end ());
43
cout « "The contents of list 3 after inserting the contents of";
cout « "list 1 at the beginning:" « endl;
DisplayContents (listlntegers3);
47
// Вставка элементов из другого списка в конец...
Iistlntegers3.insert (listlntegers3.end (),
50 listlntegers2.begin (), listlntegers2.end ());
51
cout « "The contents of list 3 after inserting ";
cout « "the contents of list 2 at the beginning:" « endl;
DisplayContents (listlntegers3);
55
return 0;
Результат
The
|
contents
|
of
|
list
|
1
|
after inserting elements:
|
|
|
1 2
|
3
|
|
of
|
list
|
2
|
after inserting '4'
|
elements of a value:
|
The
|
contents
|
0
|
0
|
0
|
0
|
|
|
|
after inserting the
|
contents of list
|
1
|
at the beginning:
|
The contents of list 3
|
1 2
|
3
|
|
|
|
|
after inserting the
|
contents of list
|
2
|
at the beginning:
|
The contents of list 3
|
1 2
|
3
|
0000
|
|
|
|
|
|
|
430 ЗАНЯТИЕ 18. Классы двухсвязного иодносвязного списков библиотеки ST.
Анализ
Функции-члены b e g in () и e n d () возвращ ают итераторы, указывающ ие на начал;
конец списка соответственно. Это справедливо для всех контейнеров STL, включа* s t d : : l i s t . Его функция i n s e r t () получает итератор, отмечающий позицию, перед ю> торой должны быть вставлены элементы. Используемый в строке 24 итератор, возвращае мый функцией e n d (), указывает на позицию после последнего элемента в списке. П оэто му эта строка вставляет целочисленное значение 3 перед концом, как последнее значение В строке 32 список инициализируется четырьмя помещенными в начало элементами сс значением 0. Строки 41 и 42 демонстрируют применение функции l i s t : : i n s e r t () дл* вставки элементов из одного списка в конец другого. Хотя в этом примере вставляете* список целых чисел в другой список, вставлен может быть также диапазон из вектора, определяемый методами b e g in () и e n d (), как в листинге 18.1, или обычного статиче ского массива.
Do'stlaringiz bilan baham: |