Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
#1

Возможно ли это на с++? - C++

07.08.2011, 19:46. Просмотров 2701. Ответов 56
Метки нет (Все метки)

Допустим есть класс
Код
class MyBool{
int data;
//Читаем бит номер num
bool GetVal(num){return data&(1<<num);}
//Записываем в бит номер num значение val
void SetVal(num,val){val?data|=(1<<num):data&=~(1<<num);}
};
т.е. определены побитовое хранение булевых значений, их чтение и запись.
А теперь вопрос: Существует ли способ определить операторы так, чтобы работал следующий код:
Код
MyBool a;
if(a[0])
    a[1]=true;
Соответственно a[0] делает GetVal(0), a[1]=true делает SetVal(1,true)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2011, 19:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возможно ли это на с++? (C++):

Структура в классе, это возможно? - C++
У меня такая проблема, нужно реализовать объект-список. В нем необходимо реализовать методы обеспечивающие полную функциональность списка. ...

Возможно ли это заменить циклом? - C++
Здравствуйте! Подскажите, как этот фрагмент, можно заменить циклом? ... cout &lt;&lt; &quot;Введите количество часов: &quot;; cin &gt;&gt; hours1 &gt;&gt;...

Как это возможно сделать? - C++
Как это сделать на с++

Partition для map. Возможно ли это? - C++
Доброго времени суток, скажите пожалуйста, как применить parttition для map, если это возможно. Нашел информацию для vector-а, с map...

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

Заменить оператор goto на цикл, если это возможно - C++
Есть простой таймер #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main(){ ...

56
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.08.2011, 21:03 #16
Цитата Сообщение от LosAngeles Посмотреть сообщение
в таком случае о таком синтаксисе забудь
почему это? перегрузка оператора решает все
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 21:11  [ТС] #17
Цитата Сообщение от Maxwe11 Посмотреть сообщение
почему это? перегрузка оператора решает все
А можно пример описания, пожалуйста? Или хотя бы идею как именно перегрузить.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 21:12 #18
Цитата Сообщение от Maxwe11 Посмотреть сообщение
почему это? перегрузка оператора решает все
речь идем о том, что он хочет хранить целое значения (имея доступ по битам), а в операторе хочет возвращать через bool&
естесственно это так работать не будет
но можно реализовать как в std::bitset и в контейнерах вообще - возвращать reference, у которой есть перегрузка operator= и оператора приведения типа, a класс reference связан с контейнером std::bitmap
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 21:25  [ТС] #19
Кстати, а насколько подход контейнеров к хранению битов "хуже" чем получение битов в лоб из инта в плане производительности?
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
07.08.2011, 21:27 #20
возможно/невозможно
Возможно, только имхо - быдлокод получится, а вот, чтоб "красиво" было, по-моему не выйдет.
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 21:30  [ТС] #21
Цитата Сообщение от Kastaneda Посмотреть сообщение
Возможно, только имхо - быдлокод получится, а вот, чтоб "красиво" было, по-моему не выйдет.
Главное - не красиво внутри, главное внутри эффективно, а снаружи красиво. Поэтому я и не спешу использовать vector<bool> - все vector<> уже не зарекомендовали себя там, где сильно нужна производительность.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 21:35 #22
Цитата Сообщение от Teravisor Посмотреть сообщение
Поэтому я и не спешу использовать vector<bool> - все vector<> уже не зарекомендовали себя там, где сильно нужна производительность.
да ну? программы на алгоритмах и stl'вских контейнарах в большинстве случаев работают эффективнее написанных ручками
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 21:45  [ТС] #23
Цитата Сообщение от alex_x_x Посмотреть сообщение
да ну? программы на алгоритмах и stl'вских контейнарах в большинстве случаев работают эффективнее написанных ручками
В большинстве, но не всегда. Если кривыми ручками, то конечно.
Но тут я либо не понимаю принцип STL, либо не понимаю как они это хорошо реализовали - разве на получение reference и его использование не тратятся лишние ресурсы?
Например если просто в описанном в первом посте классе задать массив интов, и делать выбор из них нужного - банальным делением - не будет ли так быстрее при доступе к большому количеству битов, хранящихся в интах? Ведь нам на каждом шаге не нужен reference - только деление - результат деления и остаток(в асме знаю, что остаток и результат сразу доступны после 1й команды) и две булевы операции. Или все таки reference быстрее будет работать? Ведь даже у него нет никаких способов указать на конкретный бит одной ссылкой.
По сути с референсами надо перейти по ссылке и все равно выполнить те же операции, чтобы достать бит. Переходы быстрые, но зачем делать лишнее там, где планируется пускать по миллионам записей?

Про вектор я говорил что не годится, т.к. в некоторых случаях лучше делать циклический один раз выделенный массив, чем вектор - намного шустрее работает. Но зависит от того, где и зачем.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
07.08.2011, 21:52 #24
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
вот быдлокод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class MyBool{
int data;
unsigned last_mask;
public:
    MyBool(int d=0):data(d),last_mask(0){}
 
    MyBool& operator[](int num){
        last_mask=1<<num;
        return *this;
    }
 
    void operator=(bool b){
        data=(b ? data|last_mask : data&(~last_mask));
    }
 
    operator bool(){
        return data&last_mask;
    }
    friend std::ostream& operator<<(std::ostream &os,MyBool ob){
        return os<<std::hex<<ob.data;
    }
};
 
 
 
int main(){
    MyBool mb;
    std::cout<<mb<<std::endl;
    mb[0]=true;
    mb[1]=true;
    mb[2]=true;
    std::cout<<mb<<std::endl;
    if(mb[0])
        std::cout<<"mb[0] = true"<<std::endl;
    else std::cout<<"mb[0]=false"<<std::endl;
    return 0;
}
Может кто-нибудь красивее сделает?
4
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 22:05 #25
Teravisor, насчет скорости bitset не знаю - мне кажется он скорее для удобства, но в том же std::vector<bool> реализован нужны вам функционал, но не реализованы удобства типа возврата reference и работы с ним
насчет того как может быть быстрее:
1) для разных типов контенеров ( с разным типом доступа ) представлены разные алгоритмы
2) для stl у компилятора большие возможности инлайнить алгоритмы и операции контейнеров

Добавлено через 7 минут
Kastaneda, неплохо!
издержки, что не работает код вида
mb[0]=mb[1]=true;
1
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 22:14  [ТС] #26
Цитата Сообщение от Kastaneda Посмотреть сообщение
Может кто-нибудь красивее сделает?
Красиво, и потери небольшие. Я до такого не додумался бы)

Цитата Сообщение от alex_x_x Посмотреть сообщение
Teravisor, насчет скорости bitset не знаю - мне кажется он скорее для удобства, но в том же std::vector<bool> реализован нужны вам функционал, но не реализованы удобства типа возврата reference и работы с ним
насчет того как может быть быстрее:
1) для разных типов контенеров ( с разным типом доступа ) представлены разные алгоритмы
2) для stl у компилятора большие возможности инлайнить алгоритмы и операции контейнеров
Да, идея здравая, скорее всего так и сделаю. Придется покопаться в stl и посмотреть какие алгоритмы мне нужны.

Буду теперь копаться и думать.

Спасибо за ваше внимание и помощь в этой теме.

Добавлено через 4 минуты
Цитата Сообщение от alex_x_x Посмотреть сообщение
Добавлено через 7 минут
Kastaneda, неплохо!
издержки, что не работает код вида
mb[0]=mb[1]=true;
А тут возникает как раз проблема - чтобы это предусмотреть придется еще потратить скорости, хотя для конкретно нашего случая это не надо. В этом и проблема STL
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
07.08.2011, 22:49 #27
Цитата Сообщение от alex_x_x Посмотреть сообщение
издержки, что не работает код вида
mb[0]=mb[1]=true;
Да, не подумал.
Цитата Сообщение от Teravisor Посмотреть сообщение
А тут возникает как раз проблема - чтобы это предусмотреть придется еще потратить скорости
Можно operator= вот так сделать:
C++
1
2
3
4
    bool operator=(bool b){
        data=(b ? data|last_mask : data&(~last_mask));
        return b;
    }
теперь работает, и ни каких (почти) лишних затрат
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 23:04  [ТС] #28
Цитата Сообщение от Kastaneda Посмотреть сообщение
и ни каких (почти) лишних затрат
То же самое можно сказать и про то, как вы перешли от моих SetVal и GetVal к операторам. Если чуть приглядеться, то можно увидеть что и конвеер некоторых процессоров может работать хуже, и присваивание лишнее... Может компилятор это и оптимизировать сможет, но не факт. А 10 раз по камню это уже гора.
0
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
07.08.2011, 23:17 #29
Цитата Сообщение от Teravisor Посмотреть сообщение
Главное - не красиво внутри, главное внутри эффективно, а снаружи красиво. Поэтому я и не спешу использовать vector<bool> - все vector<> уже не зарекомендовали себя там, где сильно нужна производительность.
Вы не правы. Наши ребята-олимпиадники сравнивали производительность вектора и "самопального" динамического массива в разных задачах. Как правило, реализация с вектором оказывалась всегда хоть немного, но быстрее любых "самопальных" структур.
0
Jupiter
07.08.2011, 23:19     Возможно ли это на с++?
  #30

Не по теме:

а если еще сравнить исходники вектора в составе vs и gcc, так мелкософт это просто кучка непрофессионалов

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2011, 23:19
Привет! Вот еще темы с ответами:

Доступ к данным в *.mdb посредством OLE DB -- это возможно? - C++
Почти две недели бьюсь над этой проблемой. Перерыл весь инет, книжку по OLE DB купил... Не могу понять каким образом через OLE DB...

Как записать в вектор структуру? Это вообще возможно сделать? - C++
Привет всем! Как записать в вектор структуру? Это вообще возможно сделать? Надо, чтоб первая строка из файла записывалась в вектор,...

Рекурсивная программа. Составить пары из группы, если это возможно - C++
Ребят, срочно нужна помощь! Не прошу делать что-то за меня, просто подскажите способ реализации?

Возможно ли создать свою фцию system() и как это сделать? - C++
Возникла потребность реализовать вызов ф-ции system() без упоминания таковой (то есть слова system). Как можно это сделать. Возможно ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
07.08.2011, 23:19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru