[ Обновленные темы · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
ООП для самых маленьких
eXceedДата: Пятница, 27.06.2008, 02:54 | Сообщение # 16
Генералиссимус
Группа: Гости
Сообщений: 5466
Репутация: 616
Статус: Offline
Продолжаем изучать контейнер vector. Сегодня я покажу как использовать итераторы.

Как вы должны знать уже, что в С++ массивы и указатели очень тесно связаны. Доступ к массиву можно получать либо через оператор индекса, либо через указатель. По аналогии с этим, в библиотеке STL имеется тесная связь между векторами и итераторами. Доступ к членам вектора можно получить либо через оператор индекса, либо через итератор. В примере показаны оба подхода.

Code
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    int i;
    vector<int>::iterator p = v.begin(); //Объявление итератора указывающего на начало вектора

    //Помещение значений в вектор
    for (i = 0; i < 10; i++)
    {
     v.push_back(i);
    }
    //Доступ к содержимому вектора с использованием оператора индекса
    for (i = 0; i < 10; i++)
    {
     cout << v[i] << " " << endl;
    }
    //Доступ к вектору через итератор
    while (p != v.end())
    {
     cout << *p << " ";
     p++;
    }

    return 0;
}

В результате выполнения на экране появится следующие:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

Обратите внимание на объявление итератора p. Тип итератора должен соответствовать классу контейнера, где итератор предпологается использовать.

Так же советую посмотреть пример в аттаче к посту. В этом примере вектор используется для хранения объектов класса, определенного мною. Обратите внимание, что в класса определяется конструктор по умолчанию и перегруженные версии операторов < и ==. Пример сделан для демонстрации возможности перегрузки операторов и хранения в контейнерах типа vector не только численных значений, но и других объектов.
В следующей статье я объясню возможности языка по перегрузке, в том числе и по перегрузке операторов. Это одна из "фишек" языка C++ и ООП в целом.
з.ы. Помните, в зависимости от того, как реализована библиотека STL для компилятора, вам может понадобится определить и другие операторы сравнения.

Прикрепления: Ex6.7z (355.7 Kb)


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
ExpertДата: Пятница, 27.06.2008, 06:41 | Сообщение # 17
Главный
Группа: Администраторы
Сообщений: 6114
Репутация: 134
Статус: Offline
Quote (vitalyu)
На самом деле, я вот все жду, когда ты свою книгу выпустишь

Хорошая идея. Выпустить книгу в одной из типографий С-ра ~ 10 000 р. тиражом ~ 100. Можем скинуться.

Quote (vitalyu)
Читать реально интересно

+1

Quote (vitalyu)
Я хоть и не отписываю, но читаю постоянно

аналогично


Блог декана

Уведомление для прессы и всех пользователей сети интернет: администрация форума может не заметить вовремя нецензурных слов и других, возможно, оскорбительных выражений/картинок/прочих материалов. Если вы заметили косвенный либо прямой факт оскорбления кого бы то ни было, пожалуйста, сообщите об этом администратору форума для принятия решения об удалении/модерировании соответствующего сообщения. Полный текст уведомления см. здесь.
 
eXceedДата: Понедельник, 06.04.2009, 11:47 | Сообщение # 18
Генералиссимус
Группа: Гости
Сообщений: 5466
Репутация: 616
Статус: Offline
Не стал открывать новую тему. Но данный вопрос очень важен для программистов в связи с подходящими сроками сдачи курсовой по Криптографии. Тем кто пишет в стиле party hard и ООП во все поля, читать в первую очередь.

Динамическая идентификация типов

Динамическая идентификация необходима для однозначной идентификации типа данных. Чаще всего возникает необходимость в этом когда на этапе выполнения программы тип данных не известен. Характерно для языков поддерживающих полиморфизм. Например C++ или Delphi.

Информацию об объекте получают с помощью оператора typeid(описан в <typeinfo>). Синтаксис: typeid(объект). Здесь объект - это тот объект информацию о типе которого нужно получить. Оператор typeid() возвращает ссылку на на объект типа type_info, который и будет описывать тип объекта объект. Хочу заметить, что typeid может идентифицировать любые типы и объекты.

Пример использования.

Например есть два класса рожденных от BaseClass который имеет virtual void f() - делает BaseClass полиморфным.

Derived1: public BaseClass и Derived2: public BaseClass.

int i; Derived1 ob1; Derived2 ob2; BaseClass *p, baseob;

Вывод на экран встроенного типа данных.

cout << "Тип переменной i - это" << typeid(i).name() <<endl;

Обработка полиморфных объектов.

p = &baseob;

cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;

p = &ob1;

cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;

p = &ob2;

cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;

В результате на экране увидим.

Тип переменной i - это int
Указатель p указывает на объект типа BaseClass
Указатель p указывает на объект типа Derived1
Указатель p указывает на объект типа Derived2

В том числе возможно использование typeid и в перегруженных конструкциях. Метод работы не отличается.

Динамическое приведение типов данных.

Кроме стандартного приведения типов возможны приведения типов объектов. Далее рассмотрим работу dynamic_cast. Для начала рассмотрим его, т.к. он имеет прямое отношение к динамической идентификации типов.

Оператор dynamic_cast реализует приведение типов в динамическом режиме, что позволяет контролировать правильность приведения типа в "реалтайме". Если приведение типов не произойдет при помощи dynamic_cast то возникнет исключительная ситуация(или просто ошибка приведения)

Основная форма каста: dynamic_cast<целевой тип>(выражение). Рассмотрим простой пример.

Предположим, что Base - это базовый класс, а Derived - это класс, производный от Base.

Base *bp, b_ob;
Derived *dp, d_ob;

bp = &d_ob; //Указатель базового класса указывает на объект производного класса.

dp = dynamic_cast<Derived *>(bp)
if(!dp) cout "Приведение прошло успешно";

Здесь приведение типа указателя bp базового класса к типу указателя dp производного класса прошло успешно, поскольку указатель bp на самом деле указывает на объект производного класса Derived. Однако в следующем примере произойдет ошибка, поскольку указатель bp указывает на объект базового класса Base, а приводить тип объекта базового класса к типу объекта произвольного класса - неправильно.

bp = &b_ob;

dp = dynamic_cast<Derived *>(bp);
if(!dp) cout "Приведения типов не произошло";

В некоторых случаях dynamic_cast можно использовать вместо typeid. Об этом и статических кастах поговорим чуть позже. А пока я буду наслаждаться ароматным зеленым чаем.


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.

Сообщение отредактировал eXceed - Понедельник, 06.04.2009, 11:49
 
lamamaДата: Вторник, 07.04.2009, 20:58 | Сообщение # 19
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Репутация: 45
Статус: Offline
Quote (eXceed)
Жаль, что лишь один человек изредка обращает внимание на этот раздел. А ведь ПиЭшники и КЗОИшники должны уметь программировать!

respect
Недавно один студент пытался пересдать дисциплину "Язык программирования Си". Его попросили написать 3 простых програмки, в том числе программа вывода текста "Hellow, world!". Результат - uhm . ТАКИЕ студенты нам не нужны, как это обидно не звучит.


Не оседать, не приживаться -
Ступенька за ступенькой - без печали,
Шагать вперед, идти от дали к дали,
Все шире быть, все выше подниматься.
 
Max-offДата: Вторник, 07.04.2009, 21:48 | Сообщение # 20
Лейтенант
Группа: Проверенные
Сообщений: 67
Репутация: 8
Статус: Offline
Quote (eXceed)
Жаль, что лишь один человек изредка обращает внимание на этот раздел. А ведь ПиЭшники и КЗОИшники должны уметь программировать!

Выпускники ПИЭ - это не кодеры, не программисты. Это внедренцы УПП иже сними системы или люди которые обслуживают эти вещи.
 
eXceedДата: Вторник, 07.04.2009, 23:03 | Сообщение # 21
Генералиссимус
Группа: Гости
Сообщений: 5466
Репутация: 616
Статус: Offline
lamama

Спасибо за оценку. Приятно видеть, что мои старания не зря.

Max-off

С вами я не соглашусь. Навыки программирования и как следствие аналитический ум со способностью самостоятельного поиска решение проблемы -> очень важное качество. Да и в профессии ПиЭ программирование нужно. Взять ту же 1С.


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
SannyДата: Вторник, 07.04.2009, 23:28 | Сообщение # 22
Правдоборец
Группа: Гости
Сообщений: 6257
Репутация: 356
Статус: Offline
Quote (Max-off)
Выпускники ПИЭ - это не кодеры, не программисты. Это внедренцы УПП иже сними системы или люди которые обслуживают эти вещи.

Научите меня внедрять УПП без программирования!!!! Готов ради этого отдать свой правый глаз! Или любой другой орган!


У меня есть план - выпить столько, сколько смогу. Отличный план!
 
Max-offДата: Среда, 08.04.2009, 00:09 | Сообщение # 23
Лейтенант
Группа: Проверенные
Сообщений: 67
Репутация: 8
Статус: Offline
Quote (Sanny)
Научите меня внедрять УПП без программирования!!!! Готов ради этого отдать свой правый глаз! Или любой другой орган!

Любая система без сервера приложений.

Quote (eXceed)
С вами я не соглашусь. Навыки программирования и как следствие аналитический ум со способностью самостоятельного поиска решение проблемы -> очень важное качество. Да и в профессии ПиЭ программирование нужно. Взять ту же 1С.

Та же 1С это не весь рынок УПП, нам не дают именно администрирования систем (не беру 1С). Сап, было у нас 2,5 часа знакомства с ним, сейчас универ купил nav, а лицензия не позволяет его администрировать. Программирование нужно лишь на уровне БД (это опять если не брать 1С), но и то если написание запросов можно назвать программированием.
Если брать ту же 1С, его язык приближен к VB, но кто нибудь нам дает VB?

 
eXceedДата: Среда, 08.04.2009, 00:30 | Сообщение # 24
Генералиссимус
Группа: Гости
Сообщений: 5466
Репутация: 616
Статус: Offline
Max-off

Дело не в том, что там приближено к ВБ. Программирование, принципы, постулаты ооп и ооп, технологии они во всех языках одни. Где то больше, где то меньше. Я программировал на Delphi много и упорно, программировал с vcl, без vcl, на чистых api и avl. Полтора года назад я понял, что дельфи не дает мне того, что я хочу. Я "перерос" язык и шагнул в мир С++. Перешел легко ибо выше перечисленное в С++ точно такое же.

И давать тебе не обязаны. Если программируешь на паскале хотя бы и есть голова которой ты не только кушаешь, то любой язык дальше освоиться легко.

Ни одной более или менее сложной системы не встречал, чтоб при наладке не пришлось для нее костыли писать.


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
SannyДата: Среда, 08.04.2009, 08:32 | Сообщение # 25
Правдоборец
Группа: Гости
Сообщений: 6257
Репутация: 356
Статус: Offline
Quote (Max-off)
Та же 1С это не весь рынок УПП

Стоп! Что есть УПП?


У меня есть план - выпить столько, сколько смогу. Отличный план!
 
StrangerДата: Среда, 08.04.2009, 22:42 | Сообщение # 26
Полковник
Группа: Гости
Сообщений: 170
Репутация: 24
Статус: Offline
ММ, Пашко, мозгуешь опять)...Тока давай как в предверии все той же курсовой, о которой писал, накидай текст по оптимизации памяти happy Как ты там у себя реализовывал) Дерзай!

"Ангелы зовут это небесной отрадой, черти - адской мукой, а люди - любовью" (Г.Гейне)
 
eXceedДата: Среда, 08.04.2009, 23:17 | Сообщение # 27
Генералиссимус
Группа: Гости
Сообщений: 5466
Репутация: 616
Статус: Offline
Ну что же. Выполняем /r/ Stranger.

Оптимизация работы с памятью. Стандартные функции C/C++.

Оптимизация работы memcpy.

Копирование памяти через промежуточный буфер ликвидирует все слабые стороны алгоритма штатной функции memcpy, значительно увеличивая тем самым ее производительность.

Ex.

Code
for (a = 0; a < count; a += subBLOCK_SIZE)
{
         for (b = 0; b < subBLOCK_SIZE; b += BRUST_LEN)
                 tmp += *(int *)((int)src + a + b);

         memcpy((int *)((int)dst + a ), (int *)((int)src + a), subBLOCK_SIZE);
}

Оптимизация memmove.

В сравнении со стандартной функцией memmove() эта работает быстрее на 15% - 20%.

Code
int __MyMemMoveX(char *dst, char *src, int size)
{
         char *p1, *p2;
         int a, x = 1;
         int delta;

         delta = dst - src;
         if ((delta < 1)) return -1;

         for (a = size; a > delta; a -= delta)
                 memcpy(dst + a - delta, src + a - delta, delta);

         return 0;
}

Оптимизация memcmp.

Code
void *__cdecl _memccpy (void *dest, const void *src, int c, unsigned count)
{
         while (count && (*((char *)(dest = (char *)dest + 1) - 1) =
         *((char *)(src = (char *)src + 1) - 1)) != (char)c) count--;

         return (count ? dest : NULL);
}

Технические обоснования писать лень, т.к. я не трезв. Могу обосновать в IRL.

Все взято из древних загашников прожжоного жизнью тролля, лжеца и девственника aka eXceed


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

close