Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Битовый массив 
:(
    Опции темы
MAKCim
Дата 19.1.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Т.е. получается, что конкретно для класса bool меняется реализация? Ведь нет типа данных Бит?

ключевые слова: специализация шаблона


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 19.1.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  19.1.2007,  20:47 Найти цитируемый пост)
ключевые слова: специализация шаблона 

Это об чем?

Мне действительно непонятна реализация такого шаблона.
Если я хочу написать свой шаблонный класс, который по-разному бы реагировал на тип в аргументе?
Например пишу шаблон:
Код

template <class T>
class Mas10
{
   T Temp[10];
// Куча полезных методов
}


И если я хочу, чтобы мой класс по-разному отреагировал на конкретный тип данных, то каким путем это решено в vector<bool>?

Повторяю: мне просто занятно стало. Это действительно как-то решено или это пожелания Герба Саттера?
PM MAIL ICQ   Вверх
MAKCim
Дата 19.1.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Anikmar
Код

template<> class Mas10<bool> {
    bool Temp[10];
...
};


Это сообщение отредактировал(а) MAKCim - 19.1.2007, 21:24


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
zkv
Дата 19.1.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Anikmar @  19.1.2007,  21:00 Найти цитируемый пост)
Это действительно как-то решено или это пожелания Герба Саттера? 

smile скорее пожелания стандарта.
Цитата(Anikmar @  19.1.2007,  21:00 Найти цитируемый пост)
Мне действительно непонятна реализация такого шаблона.

мне тоже, но я не расстраиваюсь smile (меня больше интересует практическая часть), но если бы мне вдруг захотелось разобраться, то я начал бы, пожалуй, с изучения файла vector
PM MAIL   Вверх
Anikmar
Дата 19.1.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(zkv @  19.1.2007,  21:28 Найти цитируемый пост)
то я начал бы, пожалуй, с изучения файла vector 


А вы туда заглядывали? Там достаточно много всего наверчено, я туда естественно заглянул перед тем как отправить свой пост. 

Если есть обсуждаемая тема, и есть люди, которые уже в этом разбирались - какой смысл перелопачивать кучу хедеров? Это чисто познавательный интерес - я не доходил в реализации собственных шаблонных классов до "перегрузки" с точки зрения типов - форум для того и существует, чтобы делиться опытом.

Вариант определения шаблона, показанный в посте MAKCim меня просветил (я так ни разу не делал).
НО...
Тогда получается дублирование всех методов в двух разных шаблонах для обеспечения работы с конкретными типами данных...

На самом деле в векторе немного не так сделано - там маленький служебный класс, отвечающий за выделение памяти и обращение к конкретному элементу видимо отрабатывает что-то отдельное для bool. Но сходу не нашел где.

ИМХО Я и так не особый любитель STL. Но посмотрев конкретику реализации vector у меня появились сомнения, что использование STL приведет к ускорению работы программы и к экономии памяти... Вот к экономии времени на исходный код - возможно.
PM MAIL ICQ   Вверх
Rockie
Дата 19.1.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
 у меня появились сомнения, что использование STL приведет к ускорению работы программы и к экономии памяти... Вот к экономии времени на исходный код - возможно.

все зависит от того кто и как пишет то или иное.

Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
Если есть обсуждаемая тема, и есть люди, которые уже в этом разбирались

Вот и были люди(и щас есть) которые в свое время очень долго и нудно разбирались, создавая STL и добиваясь наилучшей реализации, причем по многим критериям. 




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
zkv
Дата 20.1.2007, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
На самом деле в векторе немного не так сделано - там маленький служебный класс, отвечающий за выделение памяти и обращение к конкретному элементу 

smile, да, и совсем "небольшая" подборка базовых алгоритмов smile  
Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
ИМХО Я и так не особый любитель STL. Но посмотрев конкретику реализации vector у меня появились сомнения, что использование STL приведет к ускорению работы программы и к экономии памяти...

к ускорению по сравнению с чем?
Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
Вот к экономии времени на исходный код - возможно. 

экономия времени по сравнению с чем?

недостаток любой универсализации - дополнительные расходы ресурсов, плюсы известны.
невозможно определить эффективность универсального подхода (опять таки по сравнению с другим методом) не зная условия задачи
PM MAIL   Вверх
Anikmar
Дата 20.1.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(zkv @  20.1.2007,  06:57 Найти цитируемый пост)
по сравнению с чем?


На круг - по сравнению с "ручным" написанием. В большинстве случаев ведь не надо самому реализовывать низкоуровненвые алгоритмы и т.п. - для этого, например, придумана IDE - которая служит для ускорения написания интерфейса и многих других вещей.

Я ни коим образом не хочу принизить достоинства STL - ее писало очень много народу и очень долго. Этот вопрос я поднял чисто из интереса самообразования - из цикла "Как оно сделано" - интересно все-таки.

Любой универсализм естественно тратит рессурсы. (Взять, например, технологию COM). Конкретно задачи, указанной в данном топике, vector<bool> подоходит как нельзя лучше, не знаю на счет критерий скорости (нужна ли там супер высокая скорость или нет).

А по поводу моего личного "прохладного" отношения к STL - это чисто ИМХО.
Видимо сказывается то, что начинал я на очень скромных рессурсах - приходилось, в основном, программировать контроллеры АСУ, а там рессурсов было ну очень мало.

Цитата(zkv @  20.1.2007,  06:57 Найти цитируемый пост)
да, и совсем "небольшая" подборка базовых алгоритмов

Я не говорю про простоту класса vector. Я говорю про подход, указанный MAKCimом, когда он мне объяснил как разделить шаблоны для разных типов. Если делать разные объявления vectora для разных типов - было бы совсем соложно. Разработчики несколько упростили и вынесли типозависимые участки в маленькие служебные классы с 2 методами (их так проще сопровождать). Резюме: век живи - век учись.
Правда все равно дураком помрешь  smile 
PM MAIL ICQ   Вверх
zkv
Дата 20.1.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Anikmar @  20.1.2007,  11:49 Найти цитируемый пост)
Я не говорю про простоту класса vector. Я говорю про подход, указанный MAKCimом,

Anikmar, виноват, не внимательно прочитал ваш пост, теперь понял о чем речь. Мои извинения.
 
Цитата(Anikmar @  20.1.2007,  11:49 Найти цитируемый пост)
А по поводу моего личного "прохладного" отношения к STL - это чисто ИМХО.
Видимо сказывается то, что начинал я на очень скромных рессурсах - приходилось, в основном, программировать контроллеры АСУ, а там рессурсов было ну очень мало.

не в обиду, вспоминается герой рассказа Д. Лондона "Любовь к жизни", который довольно долгое время голодал, и потом когда его подобрали собирал сухари под матрацем smile Нет я не отрицаю, бывают "голодные" ситуации когда приходится учитывать каждый "сухарь" smile, но в большинстве задач такая экономия, пожалуй, будет смотреться как паранойя.
PM MAIL   Вверх
Anikmar
Дата 20.1.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(zkv @  20.1.2007,  13:18 Найти цитируемый пост)
но в большинстве задач такая экономия, пожалуй, будет смотреться как паранойя. 


Полностью с этим согласен!
PM MAIL ICQ   Вверх
The Thing
Дата 20.1.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: нет
Всего: 3



Специально для автора темы потратил 15 минут.

Массив рассматривается как непрерывный поток данных с лево направо. 
Вывод на экран до и после вырезания битов:
-------------------------------
11101100 11100000 11101100 11100000 00100000 11101100 11111011 11101011 11100000 00100000 11110000 11100000 11101100 11110011 

11101100 11101111 10111110 10111110 00000010 00001111 00001110 00001110 11001111 00110000 
-------------------------------

Код


#include <math.h>
#include <iostream>
#include <conio.h>

using namespace std;

class CWorBit
{
    char m_str[100];
    size_t m_length;
public:
    CWorBit()
    {
        strcpy_s(m_str, "мама мыла раму"); //строка которая выводится
        m_length = strlen(m_str);
    }

    void Display()
    {
        size_t pos=0;
        for(;pos<m_length; pos++){
            unsigned char _posBit=128;
            for(;; _posBit/=2){
                cout << bool(m_str[pos]&_posBit) << flush;
                if(_posBit == 1)
                    break;
            }

            cout << " " << flush;
        }
    }

    void SetBit(size_t Idx, bool zn);
    bool GetBit(size_t Idx);
    void CutMusk(size_t m, size_t n);
};

//получить бит
bool CWorBit::GetBit(size_t Idx)
{
    unsigned char posBit_beg = 128;
    size_t pos=0;
    for(; pos<size_t(double(Idx%8)+0.0001); pos++)
        posBit_beg = posBit_beg/2;

    return (bool)(m_str[Idx/8]&posBit_beg);
}

//поставить бит
void CWorBit::SetBit(size_t Idx, bool zn)
{
    unsigned char posBit_beg = 128;

    size_t pos=0;
    for(; pos<size_t(double(Idx%8)+0.0001); pos++)
        posBit_beg = posBit_beg/2;

    if(zn)
        m_str[Idx/8] = m_str[Idx/8]|posBit_beg;
    else{
        if(m_str[Idx/8]&posBit_beg)
            m_str[Idx/8] = m_str[Idx/8]^posBit_beg;
    }
}

//Вырезать кусок
void CWorBit::CutMusk(size_t m, size_t n)
{
    if(m >=n || n > m_length*8){
        cerr << "CutMusk error m=" << m << " n=" << n << flush;
        return;
    }
    
    bool bit=0;
    size_t pos=n, erase_beg = m; //нужный нам бит
    for(;pos<m_length*8; pos++){
        bit = GetBit(pos); SetBit(erase_beg++, bit);
    }

    pos = erase_beg; //обрезаем массив
    for(;pos<m_length*8; pos++){
        SetBit(pos, 0);
    }

    m_length = strlen(m_str); //изменяем длину

}

void main(void)
{
    CWorBit wbit;
    wbit.Display();

    cout << endl;

    wbit.CutMusk(12, 48);
    wbit.Display();

    getch();
}


А всем вышекомментирующим:
не надо лениться написать три строчки кода. Вся программа заключается в функциях Get и SetBit. smile

Добавлено @ 16:49 
счет битов с нуля


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.