- •Int main(){
- •Void unsetf( fmtflags флаги );
- •Int main(){
- •0 False
- •Iostream& manip_name (iostream& stream){
- •If (stream.Rdstate() & ios::eofbit)…
- •Istrea& putback( char ch );
- •Int main()
- •If (!f.Is_open()) return 1;
- •Istream& getline (char* buf, streamsize num);
- •Istream& getline (char* buf, streamsize num, char delim);
- •Int_type peek();
- •Istream& read(char* buf, streamsize num);
- •Istream& seekg( off_type offset, seekdir origin);
- •Istream& seekg( pos_type pos);
- •Istrstream::istrstream( const char* buf);
- •Istrstream::istrstream( const char* buf, streamsize size);
- •Int main(){
- •Int main(){
- •Istrstream si(s);
- •Int count;
- •Void reset(int n)
- •Int main()
- •Int main()
- •Int main(){
- •Int main(){
- •Int main () {
- •V.Push_back ((char*) "zippy");
- •V.Push_back ((char*) "motorboy");
- •Int main () {
Int count;
public:
counter(int n)
{
reset(n);
}
Void reset(int n)
{
if(n<=up) count = n;
else count = up;
}
int run()
{
if(count>lo) return count--;
return lo;
}
};
}
Int main()
{
counter_namespace::up=100;
counter_namespace::lo=0;
counter_namespace::counter c(10);
int i;
do
{
i=c.run();
cout<<i<<" ";
}
while(i>counter_namespace::lo);
cout<<endl;
c.reset(100);
counter_namespace::lo=90;
do
{
i=c.run();
cout<<i<<" ";
}
while(i>counter_namespace::lo);
return 0;
}
3.22
Пространства имен могут быть вложенными.
namespace n1{
...
namespace n2{
// ...
}
...
}
n1::n2::item = 2
Пространства имен могут не иметь имени.
Неименованные или безымянные пространства имён - особая разновидность пространства имён, которая позволяет создавать уникальные идентификаторы, область видимости которых ограничена файлом.
namespace{
// ...
}
Область видимости идентификаторов из неименованного пространства имён ограничена файлом, в котором это пространство объявлено.
Особенности:
Внутри файла доступ к таким идентификаторам производится без использования квалификаторов;
Вне файла такие переменные невидимы;
Неименованные пространства имён позволяют избежать применения спецификатора static, который также сужает область видимости глобального имени до размеров файла.
#include <iostream>
using namespace std;
namespace
{
int j;
}
Int main()
{
j=2;
cout << j;
return 0;
}
3.23
Директива using namespace.
using namespaсe n1;
Особенности:
Применяется для добавления всех элементов некоторого пространства имён к текущему глобальному пространству имён
n1 - название пространства имён
доступ ко всем добавленным элементам может проводится без использования квалификатора
не рекомендуется для использования в глобальном пространстве имен заголовочных файлов
Объявление using::n1::member.
Особенности:
Применяется для добавления одного элемента некоторого пространства имён к текущему глобальному пространству имён
n1 - название пространства имён
member-конкретный элемент пространства имён
доступ ко всем добавленным элементам может проводится без использования квалификатора
3.24
Глобальное пространство имен
Соответствует области объявлений на уровне файла.
Стандартное пространство имен std::
Содержит все функции, данные и классы стандартной библиотеки C++.
/* пичалька :( */
3.25
Оператор asm
Для програмирования особых ситуаций есть возможность вставки в программы кода на языке Assembler
asm("инструкция");
asm инструкция;
asm { список инструкций }
Особенности:
список допустимых инструкций зависит от компилятора
#include <iostream>
using namespace std;
Int main(){
int a = 10, b = 20, c = 0;
asm{
mov eax, a
mov edx, b
add eax, edx
mov c, eax
}
cout << c;
return 0;
}
3.26
Стандартная библиотека шаблонов (STL)
STL содержит универсальные шаблонные классы и функции, реализующие большое количество широко распространенных алгоритмов и структур данных.
Особенности:
одна из мощных составных частей С++
можно применять к различным типам данных
Состав STL:
контейнеры
алгоритмы
итераторы и доп.компоненты
распределители
предикаты
функции сравнения
функторы ( объекты-функции )
Использование STL дает возможность создавать более надежные, более переносимые и более универсальные программы.
3.27
Контейнер-объект, хранящий внутри себя другие объекты.
Виды контейнеров:
Последовательные-хранящие линейные списки объектов
Ассоциативные-доступ к хранимым объектам выполняется с использованием ключа
Адаптеры - не предоставляют реализации структуры, а преобразуют одну структуру в другую, не поддерживают работу с итераторами
Контейнерные классы
<bitset>:bitset-набор битов
<deque>:deque-двунаправленная очередь
<list>:list-двунаправленный линейный список
<map>:map-набор пар ключ-значение(уникальный ключ)
multimap-набор пар ключ-значение(ключ может дублироваться);
<set>:set-множество уникальных ключей
multiset-множество(ключ может дублироваться);
<stack>:stack-стек
<queue>:queue-очередь
priority_queue-очередь с приоритетами
<vector>:vector-динамический массив
Принципы работы с контейнером
Cначала необходимо выбрать тип контейнера, который отвечает требованиям к описанию объекта(массив, список, ассоциативный массив и т.п.)
В зависимости от типа выбранного контейнера получаем доступ к функциям-членам добавления и удаления
Доступ к элементам контейнера обеспечивают итераторы, которые можно получить специальными функциями
Для работы с элементами контейнера также используются алгоритмы и специальные функции-члены.
Контейнерные последовательности.
vector
deque
list
Вектор(класс vector)
Класс vector-динамический массив, размеры которого могут изменяться при добавлении и удалении его элементов
Особенности:
1) Размер массива не фиксирован
2) Для доступа к элементам вектора может использоваться обычный способ индексации
3) Более мощное и гибкое описание, по сравнению со стандартными массивами, но менее эффективное по производительности
4) Для достижения гибкости и машинно-независимости объект, помещаемый в вектор, должен иметь конструктор по умолчанию и перегруженные операторы сравнения.
Создание вектора
Шаблонная спецификация вектора:
template<class T, class Allocator=allocator<T>>
class vector
Конструкторы:
Создание пустого вектора explicit vector(const Allocator &a=Allocator());
Создание вектора, состоящего из num элементов, имеющих значений val, которое можно задать по умолчанию:
explicit vector(size_type num, const T &val=T(), const Allocator &a=Allocator());
Создание вектора, содержащего элементы вектора ob:
vector(conts vector<t, Allocator> &ob);
Создание вектора, состоящего их элементов, лежащих в диапазоне, определенном итераторами start и end:
template<class InputIterator>
vector(inputIterator start, inputIterator end, const Allocator &a = Allocator());
#include <iostream>
#include <vector>
using namespace std;
class tempdata
{
double t;
int n;
public:
tempdata(int nn=-1,double tt=0)
{
n=nn;t=tt;
}
tempdata &operator =(double x)
{
t=x; return this;
}
double gett() {return t;}
};
int main()
{
vector<template> v;
for(int i=0;i<8;i++)
v.push_back(tempdata(i,60.0+rand()%30));
cout<<"temperature f: ";
for(int i=0;i<v.size;i++)
cout<<v[i].gett()<<" " ;
cout<<endl;
for(int i=0;i<v.size();i++)
v[i]=(v[i].gett()-32.0)*5.0/9.0;
cout<<"temperature c:";
cout.precision(2);
for(int i=0;i<v.size();i++)
cout<<v[i].gett()<<" ";
cout<<endl;
return 0;
}
Список(класс list)
Класс list - двунаправленный линейный список, размеры которого могут изменяться при добавлении и удалении его элементов.
Особенности:
Размер списка не фиксирован
Доступ к элементам списка может быть лишь последовательным
Можно перемещаться от начала к концу и от конца к началу списка
Для достижения гибкости и машинно-независимости, объект, помещаемый в список, должен иметь конструктор по умолчанию и перегруженные операторы сравнения.
Создание списка
Шаблонная спецификация списка:
template<class T, class Allocator=allocator<T>>
class list
Конструкторы:
Создание пустого списка explicit list(const Allocator &a=Allocator());
Создание списка, состоящего из num элементов, имеющих значений val, которое можно задать по умолчанию:
explicit list(size_type num, const T &val=T(), const Allocator &a=Allocator());
Создание списка, содержащего элементы вектора ob:
list(conts list<t,Allocator> &ob);
Создание списка, состоящего их элементов, лежащих в диапазоне, определенном итераторами start и end:
template<class InputIterator> list(inputIterator start, inputIterator end, const Allocator &a=Allocator());
#include <iostream>
#include < list >
using namespace std;
template <class t>
void show_list( list<t> &l, const char *name)
{
list<t>::iterator l_iter;
cout<<name<<" = ";
for(l_iter=l.begin();l_iter!=l.end(); l_iter++)
{
cout<<" "<<*l_iter;
}
cout<<endl;
}
int main()
{
//empty list
list<int> l0;
show_list (l0, "l0");
//3 elements, default value 0
list<int> l1(3);
show_list (l1, "l1");
//5 elements, value 2
list<int> l2(5,2);
show_list (l2, "l2");
//3 elements of value 1 and allocator of vector v2
list<int> l3(3,1,l2.get_allocator());
show_list (l3, "l3");
//copy of vector v2
list<int> l4(l2);
show_list(l4, "l4");
//vector by coping the range v4(1,3)
list<int> ::iterator li1=l4.begin(); li1++;
list<int> ::iterator li2=li1; li2++;li2++;
list<int> l5(li1,li2);
show_list(l5, "l5");
return 0;
}
Методы класса list
Получить итератор, установленный на первый элемент списка: iterator begin(); const_iterator begin() const;
Получить итератор, установленный на элемент, следующий за последним элементом списка: iterator end(); const_iterator end() const;
Получить ссылку на первый элемент списка: reference front(); const_reference front() const;
Получить ссылку на последний элемент списка: reference back(); const_reference back() const;
Удалить все элементы списка: void clear();
Выполнить проверку на наличие элементов вектора(true если вектор пуст): bool empty() const;
Получить текущее количество элементов списка: size_type size() const;
Добавить элемент val в конце списка: void push_back (const T &val);
Вставить элемент val перед элементом, на который указывает итератор I; возвращает итератор на вставленный элемент val: iterator insert(iterator I,const T &val);
Вставить num копий элемента val перед элементом, на который указывает итератор i:
void insert(iterator I, size_type num, const T &val);
Вставить последовательность элементов, заданную итераторами start и end перед элементом, на который указывает итератор i: template<class InputIterator> void insert(iterator I, InputIterator start, InputIterator end);
Удалить последний элемент списка: void pop_back();
Удалить первый элемент списка: void pop_front();
Удалить элемент, на который указывает итератор i; возвращает итератор на элемент, следующий за удалённым элементом: iterator erase(iterator i);
Удалить элементы диапазона, заданную итераторами start и end на элемент, следующий за последним удалённым элементом: iterator erase(iterator start, iterator end)
Удалить элементы списка, значение которых равно val: void remove(const T &val);
Изменить порядок следования элементов списка на противоположный: void reverse();
Упорядочить список(fcmp-метод сравнения элементов для упорядочивания): void sort();
template< class Cmp>
void sort(Cmp fcmp);
Переместить элементы из упорядоченного списка ob в текущий список с упорядочиванием(fcmp-метод сравнения элементов для упорядочивания)
void merge(list <t,Allocator> &ob);
template <class Cmp>
void merge(list<T, Allocator> &ob, Cmp fcmp);
Переместить все элементы из списка ob в текущий список с позиции, указанной итератором i:
void splice(iterator I, list<T, Allocator> &ob);
Переместить элемент из списка ob с позиции на которую ссылается итератор e1 в текущий список в позицию, указанную итератором i:
void splice(iterator I, list<T, Allocator> &ob, iterator el);
Переместить элемент , расположенные в диапазоне, заданном итераторами start и end из списка ob в текущий список в позицию, указаную итератором i:
void splice(iterator I, list<T, Allocator> &ob, iterator start, iterator end);
#include <iostream>
#include <list>
#include <conio.h>
using namespace std;
template <class T>
void show( list<T> &l)
{
list<T>::iterator li;
cout<<" size ="<<l.size()<<";";
cout<<"list =";
for(li=l.begin();li!=l.end(); li++)
{
cout<<*li;
}
cout<<endl;
}
int main()
{
list<char> l;
cout<<"\n insert values to list\n";
{
show(l);
for(int i=0;i<5;i++)
l.push_back(rand() %10+'a');
show(l);
}
cout<<"\n insert values to list\n";
{
show(l);
for(int i=0;i<5;i++)
l.push_front(rand() %10+'a');
show(l);
}
cout<<"\nsort list\n";
{
show(l);
l.sort();
show(l);
}
cout<<"\n merge list\n";
{
list<char> l1;
for(int i=0;i<5;i++)
l1.push_back(i+'a');
show(l1);
show(l);
l.merge(l1);
show(l);
show(l1);
}
cout<<"\nremove 'b'\n";
{
show(l);
l.remove('b');
show(l);
}
cout<<"\nreverse list\n";
{
show(l);
l.reverse();
show(l);
}
cout<<"\nsplice list\n";
{
list<char> l1;
for(int i=0;i<5;i++)
l1.push_back(rand()%10+'a');
show(l1);
show(l);
list<char>::iterator li=++l.begin();
list<char>::iterator li1s=l1.begin();
list<char>::iterator li1e=++(++l1.begin());
l.splice(li,l1,li1s,li1e);
show(l);
show(l1);
}
fflush(stdin);
getch();
return 0;
}
/* Класс <deque> по аналогии + читать методу Лу */
3.28
Ассоциативные контейнеры.
set
multiset
map
multimap
Особенности:
Классы set и multiset манипулируют множеством значений, одновременно являющихся клюючами.
Классы map и multimap манипулируют множеством значений, ассоциируемых с ключами.
Класс map
Ассоциативный массив, в котором хранятся пары ключ-значение, причем каждому ключу соответсвует одно единственное значение.
Особенности:
размер не фиксирован
не допускает дубликаты ключей
доступ к значению элементов массива может происходить по значению ключа
объект, явл. ключом, должен определять конструктор по умолчанию и операторы сравнения для хранения упорядоченного списка ключей
Созданий ассоциативного массива.
template < class Key, class T, class Cmp = less<Key>, class Allocator = allocator< pair < const Key, T > > >
class map;
Конструкторы:
создание пустого асс. массива, функция fcmp определяет поядок следования элементов массива:
explicit map ( const Cmp &fcmp = Cmp, const Allocator &a = Allocator() );
создание асс. массива, содержащего эл-ты массива ob
map ( const map< Key, T, Cmp, Allocator> & ob);
создание массива, состоящего из элементов, лежащих между итераторами start и end :
template < class InputIterator>
map ( InputIterator start, InputIterator end, const Cmp &fcmp = Cmp(), const Allocator &a = Allocator() );
Методы класса map:
(constructor) Construct map (public member function)
(destructor) Map destructor (public member function)
operator= Copy container content (public member function)
Iterators:
begin Return iterator to beginning (public member function)
end Return iterator to end (public member function)
rbegin Return reverse iterator to reverse beginning (public member function)
rend Return reverse iterator to reverse end (public member function)
Capacity:
empty Test whether container is empty (public member function)
size Return container size (public member function)
max_size Return maximum size (public member function)
Element access:
operator[] Access element (public member function )
Modifiers:
insert Insert element (public member function )
erase Erase elements (public member function)
swap Swap content (public member function)
clear Clear content (public member function)
Observers:
key_comp Return key comparison object (public member function)
value_comp Return value comparison object (public member function)
Operations:
find Get iterator to element (public member function )
count Count elements with a specific key (public member function)
lower_bound Return iterator to lower bound (public member function)
upper_bound Return iterator to upper bound (public member function)
equal_range Get range of equal elements (public member function)
Allocator:
get_allocator Get allocator (public member function )
Пара ключ-значение pair
можно создать путем вызова конструктора pair
путем использования специальной функции make_pair:
template < class KType, class VType>
pair < KType, VType > make_pair (const KType &k, const VType &v);
#include <iostream>
#include <map>
using namespace std;
