Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
1

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

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

Author24 — интернет-сервис помощи студентам
Допустим есть класс
Код
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2011, 19:46
Ответы с готовыми решениями:

Как возможно изменить даты создания файлов на сервере? И Возможно ли это?
Добрый день! Нужна помощь. Волею судьбы я был вовлечен в судебную тяжбу с веб-студией, которая...

Кто может это переработать для андроида? И вообще это возможно?
програма на CLI (windows form)

Как это сделать , если это возможно, сам не уверен
Помогите, как это сделать Пример В таблице Excel я ввожу какую нибудь формулу (Sin(x), a не...

К сыну в реанимацию забежал врач и заявил: «Это мой сын!». Возможно ли это?
Отец и сын попали в аварию. Отец скончался в больнице. К сыну в реанимацию забежал врач и заявил:...

56
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 21:30  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Kastaneda Посмотреть сообщение
Возможно, только имхо - быдлокод получится, а вот, чтоб "красиво" было, по-моему не выйдет.
Главное - не красиво внутри, главное внутри эффективно, а снаружи красиво. Поэтому я и не спешу использовать vector<bool> - все vector<> уже не зарекомендовали себя там, где сильно нужна производительность.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 21:35 22
Цитата Сообщение от Teravisor Посмотреть сообщение
Поэтому я и не спешу использовать vector<bool> - все vector<> уже не зарекомендовали себя там, где сильно нужна производительность.
да ну? программы на алгоритмах и stl'вских контейнарах в большинстве случаев работают эффективнее написанных ручками
0
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 21:45  [ТС] 23
Цитата Сообщение от alex_x_x Посмотреть сообщение
да ну? программы на алгоритмах и stl'вских контейнарах в большинстве случаев работают эффективнее написанных ручками
В большинстве, но не всегда. Если кривыми ручками, то конечно.
Но тут я либо не понимаю принцип STL, либо не понимаю как они это хорошо реализовали - разве на получение reference и его использование не тратятся лишние ресурсы?
Например если просто в описанном в первом посте классе задать массив интов, и делать выбор из них нужного - банальным делением - не будет ли так быстрее при доступе к большому количеству битов, хранящихся в интах? Ведь нам на каждом шаге не нужен reference - только деление - результат деления и остаток(в асме знаю, что остаток и результат сразу доступны после 1й команды) и две булевы операции. Или все таки reference быстрее будет работать? Ведь даже у него нет никаких способов указать на конкретный бит одной ссылкой.
По сути с референсами надо перейти по ссылке и все равно выполнить те же операции, чтобы достать бит. Переходы быстрые, но зачем делать лишнее там, где планируется пускать по миллионам записей?

Про вектор я говорил что не годится, т.к. в некоторых случаях лучше делать циклический один раз выделенный массив, чем вектор - намного шустрее работает. Но зависит от того, где и зачем.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
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
бжни
2473 / 1684 / 135
Регистрация: 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
32 / 32 / 2
Регистрация: 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
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
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
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 23:04  [ТС] 28
Цитата Сообщение от Kastaneda Посмотреть сообщение
и ни каких (почти) лишних затрат
То же самое можно сказать и про то, как вы перешли от моих SetVal и GetVal к операторам. Если чуть приглядеться, то можно увидеть что и конвеер некоторых процессоров может работать хуже, и присваивание лишнее... Может компилятор это и оптимизировать сможет, но не факт. А 10 раз по камню это уже гора.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 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, так мелкософт это просто кучка непрофессионалов:D

0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
07.08.2011, 23:27 31
Лучший ответ Сообщение было отмечено как решение

Решение

Мне кажется, что данная задача — это как раз тот случай, когда разумно воспользоваться прокси-объектами.
Ниже мои наброски. Несмотря на то, что исходный код раздулся, хороший оптимизирующий компилятор имеет широкий простор для деятельности и способен повыкидывать нафиг все прослойки.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
 
using namespace std;
 
class MyBoolContainer
{
private:
    class Accessor
    {
        public:
            Accessor(MyBoolContainer *p, unsigned i) : idx(i), ptr(p) {}
            Accessor& operator= (Accessor const& v)
                { return ((*this) = (bool)v); }
            Accessor& operator= (bool v)
            {
                if (v)
                    ptr->SetBit(idx);
                else
                    ptr->ClearBit(idx);
                return *this;
            }
            operator bool () const
                { return ptr->GetBit(idx); }
        private:
            unsigned idx;
            MyBoolContainer *ptr;
    };
 
public:
    MyBoolContainer() : val() {}
 
    Accessor operator[] (unsigned idx)
        { return Accessor(this, idx); }
 
    void SetBit(unsigned i)
        { val |= (1 << i); }
 
    void ClearBit(unsigned i)
        { val &= ~(1 << i); }
 
    bool GetBit(unsigned i) const
        { return 0 != (val & (1 << i)); }
 
    unsigned ToInt() const { return val; }
 
private:
    unsigned val;
};
 
int main()
{
    int i;
    cout << "input 1 or 0" << endl;
    cin >> i;
 
    MyBoolContainer c;
 
    c[0] = c[2] = (i&1);
    c[3] = 1;
    c[4] = c[3];
 
    cout << boolalpha;
    cout << "c[0] : " << c[0] << endl;
    cout << "c[1] : " << c[1] << endl;
    cout << "c[2] : " << c[2] << endl;
    cout << "c[3] : " << c[3] << endl;
    cout << "c[4] : " << c[4] << endl;
    cout << "c[5] : " << (c[5] = c[2]) << endl;
    cout << "c[3] == c[5] : " << (c[3] == c[5]) << endl;
    cout << "all in hex: " << hex << c.ToInt() << endl;
 
    return 0;
}
Наверняка тут ещё осталось место, где можно (или даже нужно) приложить руки, это всего лишь эскиз
4
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 23:30  [ТС] 32
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Вы не правы. Наши ребята-олимпиадники сравнивали производительность вектора и "самопального" динамического массива в разных задачах. Как правило, реализация с вектором оказывалась всегда хоть немного, но быстрее любых "самопальных" структур.
Ключевое слово здесь - динамического. Где вы видели в предложенном мной коде динамический массив? Плюс вектор массивов зачастую еще быстрее работает. Поэтому я вектор и отметаю сразу - каким бы гениальным он не был, он будет медленнее чем нединамический массив, если его можно конечно использовать.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 23:36 33
Цитата Сообщение от Teravisor Посмотреть сообщение
Ключевое слово здесь - динамического.
boost::array
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
07.08.2011, 23:51 34
Цитата Сообщение от Kastaneda Посмотреть сообщение
теперь работает, и ни каких (почти) лишних затрат
Зато вот так не работает:
C++
1
2
mb[0]=true;
mb[1]=mb[0];
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 23:59 35
grizlik78, у вас фактически реализация как bitset c Accessor вместо reference
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
08.08.2011, 00:00 36
alex_x_x, ну общий принцип-то давно в книжках описан. Но я не подсматривал, честно
0
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
08.08.2011, 00:15  [ТС] 37
Цитата Сообщение от alex_x_x Посмотреть сообщение
boost::array
А поддерживает ли побитовое хранение?

P.S. Не пробуйте сравнить по скорости эти варианты на студии. Я попробовал и долго смеялся как она компилит.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
08.08.2011, 08:42 38
Цитата Сообщение от alex_x_x Посмотреть сообщение
boost::array
Не знаю буста, но в компиляторах, частично поддерживающих 0x, есть такое:
C++
1
2
3
#include<array>
 
std::array<int,10> arr;
Оно?
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
08.08.2011, 12:22 39
Цитата Сообщение от grizlik78 Посмотреть сообщение
Мне кажется, что данная задача — это как раз тот случай, когда разумно воспользоваться прокси-объектами.
Ниже мои наброски. Несмотря на то, что исходный код раздулся, хороший оптимизирующий компилятор имеет широкий простор для деятельности и способен повыкидывать нафиг все прослойки.
Вы будете смеяться, но reference в bitset реализован на основе паттерна прокси...

Добавлено через 3 минуты
Цитата Сообщение от Teravisor Посмотреть сообщение
Ключевое слово здесь - динамического. Где вы видели в предложенном мной коде динамический массив? Плюс вектор массивов зачастую еще быстрее работает. Поэтому я вектор и отметаю сразу - каким бы гениальным он не был, он будет медленнее чем нединамический массив, если его можно конечно использовать.
Нединамический массив требует
1. константного выражения в качестве размера.
2. Должен быть глобальным, если его размер превосходит размер стека. Либо размер стека надо увеличивать.

С динамическими массивами подобных проблем нет. А скорость доступа по указателю - одинакова.
0
32 / 32 / 2
Регистрация: 07.08.2011
Сообщений: 89
08.08.2011, 14:15  [ТС] 40
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
2. Должен быть глобальным, если его размер превосходит размер стека. Либо размер стека надо увеличивать.
Или я вас не понял, или я этого не знал. Где почитать можно в надежных источниках, чтобы определиться? Если ссылка на стандарт, то пункт в нем, пожалуйста, а то он большой.

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
С динамическими массивами подобных проблем нет. А скорость доступа по указателю - одинакова.
Зависит от динамического массива и компилятора: скорость доступа к элементу vector<int> a; и скорость доступа к int* a; будет разной, можно посмотреть уже проведенные замеры в интернете.
0
08.08.2011, 14:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2011, 14:15
Помогаю со студенческими работами здесь

Возможно ли это и если да как это сделать?
Имеется удаленный сервер с управлением через KVM и с операционной системой windows server 2012, ее...

Как это возможно? И возможно ли?
Здравствуйте. есть файлы files.php, textbooks.php и т. д. GET-параметры (например):...

Это возможно?
Вобщем тут такое дело. Я создал шрифт под свой почерк. очень похожий. Но есть одна проблема что...

БД на Java, возможно ли это?
Господа, просветите меня или поправьте новичка=) Хотелось бы узнать, познать. Можно ли сделать...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru