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

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

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

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

07.08.2011, 19:46. Просмотров 2656. Ответов 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(){ ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
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
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
07.08.2011, 23:30  [ТС] #32
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Вы не правы. Наши ребята-олимпиадники сравнивали производительность вектора и "самопального" динамического массива в разных задачах. Как правило, реализация с вектором оказывалась всегда хоть немного, но быстрее любых "самопальных" структур.
Ключевое слово здесь - динамического. Где вы видели в предложенном мной коде динамический массив? Плюс вектор массивов зачастую еще быстрее работает. Поэтому я вектор и отметаю сразу - каким бы гениальным он не был, он будет медленнее чем нединамический массив, если его можно конечно использовать.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 23:36 #33
Цитата Сообщение от Teravisor Посмотреть сообщение
Ключевое слово здесь - динамического.
boost::array
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
07.08.2011, 23:51 #34
Цитата Сообщение от Kastaneda Посмотреть сообщение
теперь работает, и ни каких (почти) лишних затрат
Зато вот так не работает:
C++
1
2
mb[0]=true;
mb[1]=mb[0];
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
07.08.2011, 23:59 #35
grizlik78, у вас фактически реализация как bitset c Accessor вместо reference
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
08.08.2011, 00:00 #36
alex_x_x, ну общий принцип-то давно в книжках описан. Но я не подсматривал, честно
0
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
08.08.2011, 00:15  [ТС] #37
Цитата Сообщение от alex_x_x Посмотреть сообщение
boost::array
А поддерживает ли побитовое хранение?

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

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

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

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
С динамическими массивами подобных проблем нет. А скорость доступа по указателю - одинакова.
Зависит от динамического массива и компилятора: скорость доступа к элементу vector<int> a; и скорость доступа к int* a; будет разной, можно посмотреть уже проведенные замеры в интернете.
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
08.08.2011, 14:26 #41
Цитата Сообщение от Teravisor Посмотреть сообщение
Или я вас не понял, или я этого не знал. Где почитать можно в надежных источниках, чтобы определиться? Если ссылка на стандарт, то пункт в нем, пожалуйста, а то он большой.

Зависит от динамического массива и компилятора: скорость доступа к элементу vector<int> a; и скорость доступа к int* a; будет разной, можно посмотреть уже проведенные замеры в интернете.
1. В стандарте ни слова по этому поводу нет. Это уже особенности реализации оси и платформы. Если вы работаете в винде, то по умолчанию винда выделяет под стек (то есть под все локальные переменные) стек размером 1 метр. Локальный массив - это такая же локальная переменная, как и все остальные, поэтому размещается в стеке. В то время как глобальный массив размещается с static storage и занимает столько места, сколько нужно. Аналогично динамический размещается в куче и занимает столько места, сколько нужно. В обоих случаях используется виртуальная память.
Про никсы не скажу - не работал. Но про стек должно быть так же.
2. Вам ничто не мешает иметь доступ к элементу вектора по указателю:
C++
1
2
vector<int> v(N);
int *p = &v[0];
0
Сыроежка
Заблокирован
08.08.2011, 19:02 #42
Цитата Сообщение от Kastaneda Посмотреть сообщение
вот быдлокод:
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;
}
Может кто-нибудь красивее сделает?
Класс написан очень плохо. Во-первых, он совершенно не работает для константных объектов. Во-вторых, в нем нарушена семантика оператора присваивания, когда вместо ссылки на класс возвращается void. В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект. Поэтому после применения этого оператора ничего нельзя сказать о состоянии объекта.
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
08.08.2011, 19:07 #43
Цитата Сообщение от Сыроежка Посмотреть сообщение
В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект.
Ты про operator<<? Смотрел, смотрел, но так и не понял, о какой "неконстантной ссылке" ты говоришь. MyBool там по значению передаётся.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.08.2011, 19:20 #44
Цитата Сообщение от Сыроежка Посмотреть сообщение
В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект. Поэтому после применения этого оператора ничего нельзя сказать о состоянии объекта.
вы не поверите, но даже в случае константной ссылки ничего нельзя уверенно сказать про объект
2
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
08.08.2011, 19:46 #45
Цитата Сообщение от Сыроежка Посмотреть сообщение
Класс написан очень плохо. Во-первых...
Я ж говорю - быдлокод. Вопрос был "возможно ли это на С++", я показал, что возможно, и не более того.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2011, 19:46
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.08.2011, 19:46
Ответ Создать тему
Опции темы

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