
- •Int main (int argv, char * argc[])
- •Int main (int argv, char * argc[]);
- •Void func1 ( a& a );
- •Void func2 ( a a );
- •Void swap (int a, int b)
- •Void swap (int &a, int &b)
- •Int Year;
- •Int Month;
- •Создание и уничтожение объектов в c#. Интерфейс iDisposable и освобождение ресурсов.
- •Int m_nYear;
- •Int m_nMonth;
- •Int m_nDay;
- •Inline int even(int X)
- •System.Collections.Generic.IEqualityComparer(Of t)
- •Public:
- •Virtual int GetHashCode()
- •Ассоциативные и последовательные контейнеры stl. Понятие итератора. Общие свойства контейнеров. Особенности и применение каждого из контейнеров.
- •// Do what you need with element using *I ;
- •Vint v1, v2(100);
- •Vint v3(v2.Begin(), --v2.End());
- •Sort(V.Begin(), V.End());
- •Setstr s, s2;
- •Использование контейнеров stl. Методы резервирования памяти контейнерами stl. Требования к элементам контейнеров.
- •C.Insert(s);
- •Обобщенные контейнеры .Net. Интерфейс iEnumerable и оператор foreach. Сравнение обобщенных контейнеров и ArrayList.
- •IEnumerable - интерфейс
- •Int m_nCount;
- •Int sprintf(buffer, format-string[, argument...]); char *buffer;
- •Язык регулярных выражений. Классы символов, исчислители, последовательности и несимвольные подстановки. Валидация email адреса при помощи регулярных выражений.
- •If (rx.IsMatch(testString))
- •Язык регулярных выражений. Классы символов, исчислители, альтернативы и подстановки. Применение регулярных выражений для изменения формата даты.
- •If (rx.IsMatch(testString))
- •Язык регулярных выражений. Классы символов, исчислители, альтернативы и последовательности. Выбор всех атрибутов href из html текста.
- •If (rx.IsMatch(testString))
- •Обработка исключений. Правила перехвата исключений. Назначение системы обработки исключений. Для чего система обработки исключений не предназначена.
- •Int operator / (cMyClass o, int I) {
- •Void main() {
- •Наследование, иерархии классов и обобщенная обработка данных. Чистый полиморфизм (полиморфизм виртуальных методов). Интерфейсы и абстрактные классы.
- •Int m_nCount;};
- •Int m_nCount;
- •Int m_nCount;
- •Int m_nCount;
- •Virtual string Iam(){return "furniture";}
- •Рекурсия. Рекуррентные структуры данных и рекурсивные алгоритмы. Алгоритм просмотра дерева каталогов файловой структуры.
- •Рекуррентное определение выражений. Алгоритм анализа и вычисления выражений (программа ”калькулятор”).
Vint v1, v2(100);
Vint v3(v2.Begin(), --v2.End());
//resize vector
v1.resize(10); //v1.size() == 10
v1.push_back(2); //v1.size() == 11
//assign a vector to another vector
v3 = v1;
//access random element
v[i] = 10;
Отсортировать массив можно функцией STL sort.
//sort vector
Sort(V.Begin(), V.End());
Вектора очень эффективны при доступе к элементам по номеру, но не эффективны при изменении структуры, например, v.erase(v.begin()) (удалить первый элемент массива).
Ассоциативные контейнеры
Ассоциативные контейнеры позволяют хранить и извлекать элементы по ключу. Порядок расположение элементов в контейнере не существенен и не может быть установлен или изменен. Рассмотрим set и map.
Множество(set)
Рассмотрим множество строк. Множество – простейший ассоциативный контейнер, он позволяет хранить только ключ и установить, имеется ли данный ключ во множестве. Множества очень эффективны при поиске элементов по ключу.
//define new type
typedef set<string> SETSTR;
//create set
Setstr s, s2;
//check if set is empty
cout << s.empty() << endl; //true
//add elements
s.insert (“abc”); s.insert (“123”); // s.size() == 2
s2 = s; // s2 == s
//find elements
SETSTR::iterator i = s.find(“abc”); //i != s.end(), *i == “abc”
i = s.find(“efd”); //i == s.end()
//remove elements
s.erase (“abc”); s.erase(s.begin()); // s is empty
Таблицы (отображения)(map)
Отображения – сложнее контейнеров рассмотренных выше. Оно хранит пары (ключ, значение). Рассмотрим отображение строк в целые числа.
//define new type
typedef map<string, int> STR2INT;
//create map
STR2INT m;
//check if map is empty
cout << m.empty() << endl; //true
//add & update elements
m.insert(STR2INT::value_type(“a”,1)); // m.size() == 1
m[“b”] = 2; // m.size() == 2
m[“a”] = 3; // m.size() == 2
//find elements
STR2INT::iterator i = m.find(“a”); // i != m.end(),
// (*i).first == “a”
// (*i).second == 3
for (STR2INT::iterator i= m.begin(); i != m.end(); i++)
cout << i->first << “\t” << i->second << endl;
//remove elements
m.erase(“a”); m.erase(m.begin()); // m is empty
Отображения очень эффективны при поиске элементов по ключу.
Использование контейнеров stl. Методы резервирования памяти контейнерами stl. Требования к элементам контейнеров.
Пример применения контейнеров
|
Выборка |
Изменение структуры |
Vector |
const |
N |
List |
N/2 |
const |
map |
ln(N) |
ln(N) |
Допустим, нам нужно посчитать количество различных слов, которые поступают с консоли в нашу программу. Предположим, так же, что все они в верхнем регистре, т.е. “Hello” и “HELLO” будут поступать как “HELLO”.
Воспользуемся для решения этой задачи множеством строк.
typedef set<string> SETSTR;
SETSTR c; //Объявили контейнер
string s = … //Читаем слово
while (s != “”){ //пока слово не пусто
C.Insert(s);
s = … //Читаем следующее слово }
cout << c.size() << endl;
Если нужно вывести все различные слова, то
for (SETSTR:: iterator i = c.begin(); i != c.end(); i++)
cout << *i << endl;
Если необходимо посчитать и сколько раз каждое слово встречалось в тексте, то можно использовать map.
typedef map<string, int> STR2INT;
STR2INT m; //Объявили контейнер
string s = … //Читаем слово
while (s != “”){ //пока слово не пусто
m[s]++; // вставить, если не было и увеличить счетчик
s = … //Читаем следующее слово }
cout << m.size() << endl; //количество различных слов
Выводим слова и число их появления в тексте
for (STR2INT:: iterator i = m.begin(); i != m.end(); i++)
cout << i->first << “\t” << i->second << endl;
и другие примеры из вопроса №7.
Требования к элементам контейнеров.
Контейнер может хранить данные разных типов (например: массив целых чисел, массив строк, список строк и т.д.). Для последовательных контейнеров требуется переопределять операции сравнения в случае помещения в контейнер объектов (точнее их копий), но не требуется при работе с указателями на объекты.
Метод |
Описание |
Примечание |
Конструктор копии |
Создает новый элемент, идентичный старому |
Используется при каждой вставке элемента в контейнер |
Оператор присваивания |
Заменяет содержимое элемента копией исходного элемента |
Используется при каждой модификации элемента |
Деструктор |
Разрушает элемент |
Используется при каждом удалении элемента |
Конструктор по умолчанию |
Создает элемент без аргументов |
Применяется только для определенных операций |
Operator «= =» |
Проверяет два элемента на равенство |
Используется при выполнении operator == для двух контейнеров |
Operator «<» |
Определяет, меньше ли один элемент другого |
Используется при выполнении operator < для двух контейнеров |
Методы резервирования памяти контейнерами STL:
Для вектора:
Метод reserve резервирует в векторе пространства не меньше заданного, но может выделить и чуть больше запрошенного.
Метод resize инициализирует заданное количество элементов в векторе.
Метод size возвращает количество элементов в векторе на текущий момент времени.
Метод capacity возвращает количество элементов в векторе, под которые зарезервированна память (включая проинициализированные элементы).
Если один раз вызывать reserve(n1), потом еще раз вызывать reserve(n2), то элементов будет не менее, чем n2, а элементы, которые уже были в векторе останутся неизменными (т.е. размер массива не изменится), но могут переместиться в другую область памяти.
Элементы вектора должны располагаться в непрерывном адресном пространстве – это требование. Но распределением и перераспределением памяти занимается аллокатор, и какой кусок он выделит – его личное дело.