C++ за 21 день седьмое издание


Доступ к элементам вектора с использованием семантики указателя



Download 1,38 Mb.
bet296/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   292   293   294   295   296   297   298   299   ...   437
Bog'liq
word1

Доступ к элементам вектора с использованием семантики указателя



    1. элементам вектора можно также обратиться, используя подобную указателю семан­ тику итераторов (листинг 17.5).




  1. ИСТИН Г 1 7 .5 . Доступ к элементам вектора с использованием

семантики указателя (итераторов)____________________________________________________________





  1. #include




  1. #include

  2. :

    1. int main ()




    1. {




    1. using namespace std;




    1. vector veclntegers;








  1. // Вставить в вектор целые числа:



9 veclntegers.push_back (50);

414 ЗАНЯТИЕ 17. Классы динамических массивов библиотеки STL



  1. veclntegers.push_back (1);




  1. veclntegers.push_back (987);




  1. veclntegers.push_back (1001);








  1. // Доступ к объектам в векторе с использованием итераторов:




  1. vector ::iterator iElementLocator = veclntegers.begin ();




  1. // итератор, объявленный с использованием ключевого




  1. слова С++11 auto (следующая закомментированная строка)



17// auto iElementLocator = veclntegers.begin ();


18


19while (iElementLocator != veclntegers.end ())

  1. {

  2. size_t Index = distance (veclntegers.begin (),

    22










    iElementLocator);

    23

    cout

    «

    "Element

    at position

    ";

    24

    25

    cout

    «

    Index «

    " is: " <<

    ^iElementLocator « endl;

    26
















  3. // перейти к следующему элементу




  1. ++ iElementLocator;




  1. }



30



  1. return 0;







Результат


Element at position 0 is: 50


Element at position 1 is: 1


Element at position 2 is: 987


Element at position 3 is: 1001


Анализ

Итератор в этом примере ведет себя весьма похоже на указатель, и характер его при­ менения сходен с арифметикой адресов в указателе, как можно заметить в строке 25, где





  1. хранящемуся в векторе значению обращаются с использованием оператора обращение




  1. значению (*), и в строке 29, где инкремент итератора при помощи оператора ++ перево­ дит его на следующий элемент. Обратите внимание на использование в строке 21 метода s t d : : d i s t a n c e () для вычисления отсчитываемой от нуля позиции смещения элемента £

векторе (т.е. позиции относительно начала) по возвращаемому значению метода b e g in ( и указывающему на элемент итератору.




Удаление элементов из вектора

Подобно тому, как метод p u sh _ b a c k () обеспечивает вставку в конец вектора, метод p o p _ b ac k () обеспечивает удаление элемента из него. Удаление элемента из вектора при помощи метода p o p _ b a c k () занимает постоянное время, т.е. время удаления не зависит от количества хранящихся в векторе элементов. Код в листинге 17.6 демонстрирует ис­ пользование функции pop b a c k () для удаления элементов с конца вектора.



Типичные операции с вектором

415

ЛИСТИН Г 1 7 .6 . Использование метода pop back () для удаления последнего элемента





  1. #include




  1. #include




  1. using namespace std;








  1. template




  1. void DisplayVector(const vector& veclnput)

  2. {

  3. for (auto iElement = veclnput.cbegin() // auto и cbegin(): C++11

    8

    ;

    iElement != Input.cend()

    // cend() только C++11

    9

    ;

    ++ iElement )




  4. cout « *iElement « ' ';


  5. cout « endl;

:з }


14



  1. int main ()




  1. {

  2. vector veclntegers;








  1. // Вставить в вектор целые числа:

veclntegers.push_back (50);





  1. veclntegers.push_back (1);

  2. veclntegers.push_back (987);




  1. veclntegers.push_back (1001);







25 cout « "Vector contains " « veclntegers.size ()



  1. " elements: ";




  1. DisplayVector(veclntegers);



2 7

  1. // Удалить один элемент в конце




  1. veclntegers.pop_back ();

30
31 cout « "After a call to pop_back()" « endl;


32 cout « "Vector contains " « veclntegers.size ()



  1. " elements: ";




  1. DisplayVector(veclntegers);








  1. return 0;




  1. }



Результат


Vector contains 4 elements: 50 1 987 1001


After a call to pop_back()


Vector contains 3 elements: 50 1 987


Анализ

Вывод указывает, что метод p o p _ b a c k (), используемый в строке 29, сократил коли­ чество элементов в векторе, удалив последний вставленный в него элемент. В строке 32 следующий вызов метода s i z e () демонстрирует, что количество элементов в векторе со­ кратилось на одни, как свидетельствует вывод.


416 ЗАНЯТИЕ 17. Классы динамических массивов библиотеки STL





ПРИМЕЧАНИЕ

Функция DisplayVector () в строках 4-13 листинга 17.6 приняла форму







шаблона по сравнению с листингом 17.3, где она получала только вектор целых




чисел. Это позволит нам повторно использовать этот шаблон функции для век­




тора типа float (вместо типа int):




vector vecFloats;




DisplayVector(vecFloats); // работает, поскольку это обобщение




function




Теперь она поддерживает вектор любого класса, который предоставляет опера­




тор *, возвращающий значение, понятное оператору cout.

Концепция размера и емкости


Размер (size) вектора — это количество хранимых в нем элементов. Емкость (capacity ■ вектора — это общее количество элементов, которые могут быть сохранены в векторе прежде, чем повторное резервирование памяти позволит сохранить больше элементов Поэтому размер вектора меньше или равен его емкости.

Количество элементов в векторе можно выяснить, вызвав функцию s i z e ():




cout << "Size: " « veclntegers.size ();

Емкость возвращает функция c a p a c i t y ():




cout << "Capacity: " « veclntegers.capacity () « endl;

При частом повторном резервировании памяти для внутреннего динамического масси­ ва вектор может создать проблемы с производительностью. Эта проблема в значительной степени может быть решена при помощи функции-члена r e s e r v e (ч и сл о ) . По существу, она увеличивает объем памяти, резервируемой для внутреннего массива вектора, что по­ зволяет сохранять больше элементов без повторных резервирований. В зависимости от типа хранимых в векторе объектов, сокращение количества повторных резервирований сокращает также время копирования объектов и экономит производительность. Пример кода в листинге 17.7 демонстрирует различие между размером и емкостью.





  1. И С ТИ Н Г 1 7 .7 . Демонстрация применения методов size () и capacity ()________________




    1. #include




    1. #include

  1. :




    1. int main ()




    1. {




    1. using namespace std;

  1. :




  1. // Создание экземпляра вектора, способного изначально




    1. содержать 5 целых чисел




  1. vector veclntegers (5);

9:



  1. cout « "Vector of integers was instantiated with " « endl;




  1. cout « "Size: " « veclntegers.size ();

Концепция размера и емкости

417




  1. cout « ", Capacity: " « veclntegers.capacity () « endl;








  1. // Вставка в вектор 6-го элемента




  1. veclntegers.push_back (666);



16:



  1. cout « "After inserting an additional element..." « endl;




  1. cout « "Size: " « veclntegers.size ();



19: cout « ", Capacity: " « veclntegers.capacity () « endl;
2 0 :

  1. // Вставка другого элемента




  1. veclntegers.push_back (777);








  1. cout « "After inserting yet another element... " « endl;




  1. cout « "Size: " « veclntegers.size ();




  1. cout « ", Capacity: " « veclntegers.capacity () « endl;








  1. return 0;




  1. }



Результат




Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   292   293   294   295   296   297   298   299   ...   437




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish