Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 64
Текст из файла (страница 64)
В любом случае, если в векторе хранятся элементы, то с помощью оператора индекса массива к этим элементам можно получить доступ и их изменить. Удалить элементы из вектора можно с помощью функции егаве(). Самоучитель С+-т 428 Описание Функция-член чоЫ с1еаг(); Ьоо) е~прФУ() сопз1; чоЫ рор ЬасК(); гегегепсе ЬасЦ); сопз1 гегегепсе ЬасК() сопзФ; Иега1о г Ьее!п () 1 сопв1 иегаФог Ьея1п() сопз1; з)хе 1уре сарае!Фу() сопзФ; ИегаФог епд(); сопвФ Иега1ог епс(() сопз1; Иега1ог егазе(ИегаФог ))1 НЕГа(ОГ егазе(ИегаФог НаЧаЛО, Нега(ог конец»; гегегепсе Фгоп1(); сопвФ гегегепсе Фгоп1() сопв1; апоса1ог 1уре ЕеФ аносавог() сопв1; ИегаФог 1пвегФ(ИегаФог г, сопев т йэначение = Т()) 1" чо1б 1пвегФ(йегаФог ), в(ге 1урс число, сопв1 Т Йэначение)1 ФепФр)а(е<с)авв )п)(ег> чоЫ 1пвегФ(11егаФог ), 1п11ег начало, 1пИег конец); в1*е 1уре пФах„з1хе(] сопвФ; геФегепсе орегаФог[) (э(хе 1уре )) сопвФ; сопз1 гегегепсе орегаФог[) (з!*е Фуре !) сопв1; чоЫ рцвЬ„Ьаск(сопвФ Т )Фэнэчение)1 Таблица !4.
2(продолжение) Возвращает ссылку на последний элемент вектора Возвращает итератор первого элемента век- тора Возвращает текущую емкость вектора, т. е. то число элементов, которое можно разместить в векторе беэ необходимости выделения дополнительной области памяти Удаляет все элементы вектора Возвращает истину, если вызывающий вектор пуст, в противном случае возвращает ложь Возвращает итератор конца вектора Удаляет элемент, на который указывает ите- ратор к Возвращает итератор элемента, кото- рый расположен следующим за удаленным Удаляет элементы, заданные между итерато- рами начало и конец.
Возвращает итератор элемента, который расположен следующим за последним удаленным Возвращает ссылку на первый элемент вектора Возвращает распределитель памяти вектора Вставляет параметр значение перед элемен- том, заданным итератором Ф Возвращает ите- ратор элемента Вставляет число копий параметра значение перед элементом, заданным итератором / Вставляет последовательность, определенную между итераторами начало и конец, перед элементом, заданным итератором ( Возвращает максимальное число элементов, которое может храниться в векторе Возвращает ссылку на элемент, заданный параметром ) Удаляет последний элемент вектора Добавляет в конец вектора элемент, значение которого равно параметру значение Глава 14.
Библиотека стандартных шаблонов Таблица 14<2 (продолжение) 4Рункция-член Описание чоь6 гевегче(в!ге 1уре число); чо!6 гев!ге(в!ге 1уре число, Т значение = Т(!); в!ге 1уре в!ге(! сспв1; чоЫ вчгар(чес1сг<Т, АИос а1ог> йобьект)11 1, В представленном ниже коротком примере показаны основные операции, которые можно выполнять при работе с вектором. 1п( па1п () чессог<(пс> ч; // создание вектора нулевой длины 1пс // вывод на экран размера исходного вектора ч соил « "Размео = " « ч.з1ге() « епс)1; номецение значений в конец вектора, по мере необходимости вектор будет расти 1от(1=01 1<10; 1++) ч.рпзП Ьас)г(1); вывод на экран текущего размера вектора ч соцт « "Новый размер = " « ч.ауге() «епд1; гечегве Иега1сг гЬед!пО; еапв1 гечегве Иега1ог гпед!и(! сопв1; гечегве Иегв1сг генг!Ц! сспв1 гечегве Иега1ег гепаЦ сопв1; // Основные операции вектора т!1т!с!п.т)е <1озгвеатл> ()1пс1пс(е <честог> цз!пя патпезрасе зСФ Возвращает обратный итератор конца вектора Возвращает обратный итератор начала вектора Устанавливает емкость вектора равной, по меньшей мере, параметру число элементов Изменяет размер вектора в соответствии с параметром число.
Если при этом вектор удлиняется, то добавляемые в конец вектора элементы получают значение, заданное параметром значение Возвращает хранящееся на данный момент в векторе число элементов Обменивает элементы, хранящиеся в вызывающем векторе, с элементами в объекте объект Самоучитель // вывод на экран содержимого вектора сопЕ « "Текущее содерзюмое: М"' Еог(1=0) 1<у.зтке[); Тн-) сонь « у[1, '« соцп « еде[1) помещение новых значений в конец вектора, // и опять по мере необходимости вектор будет расти ~от(1=07 1<10; 1++) ч.рпвй )васк (1+10); вывод на экран текущего размера вектора сонг « "новью размер = " « у. зажео « епс)1; вывод на экран содержтьмого вектора сонг « "текущее содержимое: ~п"; Йод(1=0; т ку.втже(); 1++) соцс « у[1] « соиь « епс)1; изменение содержимого вектора гог( 1=0; 1<и. зьке () ) 1++) у [1 ] = у [1] + у [1] // вывод на экран содержимого вектора сон « "удвоенное содержимое: Хп"; аког(з.=ог 1<у.з1ве()7 1е+) сорб « ъ[=] « м1 ™; соцб « епс11; гебцгп 0 После выполнения програм)4ы на экране появится следующее: Размер = о Новый размер = 10 Текущее содержимое: 0 1 2 3 4 5 6 7 8 9 Новый размер = 20 Текущее содержимое: О 1 2 3 4 5 б 7 8 9 10 11 12 13 14 15 16 17 18 19 удвоенное содержимое: О 2 4 б 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 Тщательно проанализируйте программу.
В функции п)аш() создается вектор ч для хранения целых. Поскольку не используется никакой инициализации, зто пустой вектор с равной нулю начальной емкостью, то есть это вектор нулевой длины. Этот факт подтверждается вызовом функции-члена яиц. Далее с помощью функции-члена рввЬ ЬасЩ к концу вектора у добавляется десять элементов. Чтобы разместить эти новые элементы, вектор у вынужден увеличиться. Как показывает выводимая на экран информация, его размер стал равным 10. После этою выводится содержимое вектора у.
Обратите внимание, что для этого используется обычный оператор индекса массива. Далее к вектору добав- Глава 14. Библиотека стандартных шаблонов 43? ляется еще десять элементов и, чтобы их разместить, вектор снова автоматически увеличивается. В конце концов, с помощью стандартного оператора индекса массива меняются значения элементов вектора.
В программе есть еще кое-что интересное. Отметьте, что функция т,зие0 указана прямо в инструкции организации цикла вывода на экран содержимого вектора т. Одним из преимуществ векторов по сравнению с массивами является то, что вы всегда имеете возможность определить текущий размер вектора. Очевидно, что такая возможность может оказаться полезной в самых разных ситуациях, 2. Кяк вы знаете, в С++ массивы и указатели очень тесно связаны. Доступ к массиву можно получить либо через оператор индекса, либо через указатель. По аналогии с этим в библиотеке стандартных шаблонов имеется тесная связь между векторами и итераторами.
Доступ к членам вектора можно получить либо через оператор индекса, либо через итератор. В следующем примере показаны оба этих подхода. Организация доступа к вектору с помощью итератора ()1пс1цс)е <1овггеап~> ()1пс1цс)е <лес ог> цв1пу пап~еврасе в~6; 1пс п~а1п ( ) чесгог<1пс> ч; 11 создание вектора нулевой длины 1пг 1; помещение зна ~ений в вектор аког (1-0; 1«10; 1++) ж.рцвЬ Ьас)» (1) /1 доступ к содержимому вектора с использованием оператора индекса лог(1=0; 1<10~ 1++) сонг « ж(1) « сонг « епс)1; /1 достуг.
к вектору через итератор чессог<1пв>:: )Сегасог р = >.Ье91п() ъЫ1е(р !=ъ,епс() ) ( соцс « *р р++; гегцгп О; После выполнения программы на экране появится следующее: 012345б789 012345б789 Самоучитель С++ 432 В этой программе тоже сначала создается вектор ч нулевой длины. Далее с помощью функции-члена ривЬ Ьас)(() к концу вектора ч добавляются некоторые значения и размер вектора ч увеличивается. Обратите внимание на объявление итератора р. Тип (тегатог определяется с помощью класса-контейнера.
То есть, чтобы получить итератор для выбранного контейнера, объявить его нужно именно так, как показано в примере: просто укажите перед типом (тега1ог имя контейнера. С помощью функции- глена ЬеязвО итератор инициализируется, указывая на начало вектора. Возвращаемым значением этой функции как раз и является итератор начала вектора. Теперь„применяя к итератору оператор инкремента, можно получить доступ к любому выбранному элементу вектора. Этот процесс совершенно аналогичен использованию указателя для доступа к элементам массива. С помощью функции-члена евдО определяется факт достижения конца вектора.
Возвращаемым значением этой функции является итератор того места, которое находится сразу за последним элементом вектора, Таким образом, если итератор р равен возвращаемому значению функции ч.епдО, значит, конец вектора был достигнут. 3. Помимо возможности размещения элементов в конце вектора, с помощью функции-члена!пяег(О их можно вставлять в его середину. Удалять элементы из вектора можно с помощью функции-члена егаяеО. // Демонстрация функций 1пзегс () и егаве О ()гпс1цое <1овтгеазп> ()1пс1цае <честог> цз)пя патпезрасе всс(т (п( зваз.п () чесгог<1пг> ч (5, 1) з // создание пятизлементного вектора // из единиц зпе з) вывод на экран исходных размера и содержимого вектора соцс « "Размер = " « ч.зз.ке() « епг)1; соцк « "Исходное содержимое:Хп") з.ог(1=0' 1<ч.я1ве()' 3++) соцс « ч[3) « соцс « епс)1; чессог<1пс>:зьпегатог р = ч.)зев и(); р += 2; // указывает на третий элемент вставка в вектор на то место, куда указывает итератор р десяти новых элементов, каждый из которых равен 9 ч.1пвегс(р, 10, 9) вывод на экран размера // и содержимого вектора после вставки соцс « "Размер после вставки = " « ч.в1ге О « епй1; 433 Глава 14.
Ьиблиотеии сгандаргныхшаблонов сопс « "Содержимое после вставки: ',и"; йог().=0; 1<ч.з(кс(); !++) соп1 « ч[11 « сонг « епд1г // удаление вставленных элементов р = ч.Ьец1пО; р ж= 2; // указывает на третий элемент ч.егазе(р, р+10); ~/ удаление следугвдх десяти элементов За элементом, на который указывает /1 итератор р вывод на экран размера // и содержимого вектора после удаления сопл « "Размер после удаления — " « ч.вбзе() « епс)1г сопс « "Содержимое после удаления:Чп"г йог(1=0; 1<ч.вхае(); 1++) сопв « ч[11 « сопл « епй1; геспгп 0; После выполнения программы на экране появится следующее: Размер = 5 Исходное содержимое: 11111 Размер после вставки = 15 Содержимое после вставки: 1! 9999999999111 Размер после удаления = 5 Содержимое после удаления: 11111 4. В следующем примере вектор используется для хранения объектов класса, определенного программистом.
Обратите внимание, что в классе определяются конструктор по умолчанию и перегруженные версии операторов < и ==. Помните, в зависимости от того, как реализована библиотека стандартных шаблонов для вашего компилятора, вам может понадобиться определить и другие операторы сравнения. // Хранение в векторе объектов пользовательского класса ((1пс1п<(е <1овсгеат> $1пс1ы<)е <чесгог> ыа1пц пагпсзрасе зМ; с1азз Вето ( <(опЫе <(; Самоучитель С++ риЬ11с: сепо () ( б = 0,0з ) Оепо (боззЬ1ех) ( б = х; ) крепо ьорегагог= (боаЬ1ех) о .= х; ге(;ззго *СЬ1аз ) бооЬ1е деобм (гепззггзаз ) Ьо11 орегаеог< (Везпо а, пепо )з) гегигзз а.де<б() < Ь.дегб()з ) Ьо11 орегасог — (ззепо а, (зепо Ь) ( гегзз г.
а.деьб() =.= Ь.дегб() з ттзг паьтз () ззес~ог<оепо> ззз (гз Г аког (1=0 з 1<10; 1++1 ч. раз)з ЬасК ( Оеп о (з /3.0) ) зог(1=0; Къ.е(хе Г) з з++1 соззг «т(11.детб() « " соззг « епб1з Гог(1=Оз 1<от.аьхе()з 1+-+) ч(11 = чу(1 .де б() 2.1; Гог(1=О) 1<з .етге Г) з соззг «< ч(Ц.дегб() <« '" "; гегззгп 0; После выполнения программы на экране появится следующее: О 0.333333 0.666667 1 1.33333 1.66667 2 2.33333 2.66667 3 О 0.7 1.4 2.1 2.8 3.5 4.2 4.9 5.6 6.3 1. Поэкспериментируйте с представленными примерами.
Попьпайтесь делать небольшие изменения в программах и исследуйте результаты. Глава 14. Библиотека стандартных шаблонов 2. В примере 4 для класса Оепю были определены два конструктора — конструктор по умолчанию (конструктор без параметров) и конструктор с параметрами. Сможете ли вы объяснить, почему это так важно? 3. Ниже представлен пример класса Соог(1. Напишите программу для хранения объектов типа Соог(1 в векторе. (Подсказка: не забудьте для класса Соогд определить операторы < и ==.) с1аяя соотб ряЬ11с: 1яя х, у; Соогс(() ( х = у .= О; ) Соотб(1от а, 1от Ь) ( х = а; у = Ь; 14.4.