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

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

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

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

07.08.2011, 19:46. Просмотров 2627. Ответов 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)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2011, 19:46     Возможно ли это на с++?
Посмотрите здесь:

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

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

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

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

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

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

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

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

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

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

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

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
С динамическими массивами подобных проблем нет. А скорость доступа по указателю - одинакова.
Зависит от динамического массива и компилятора: скорость доступа к элементу vector<int> a; и скорость доступа к int* a; будет разной, можно посмотреть уже проведенные замеры в интернете.
ValeryLaptev
Эксперт С++
1039 / 818 / 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];
Сыроежка
Заблокирован
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. В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект. Поэтому после применения этого оператора ничего нельзя сказать о состоянии объекта.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
08.08.2011, 19:07     Возможно ли это на с++? #43
Цитата Сообщение от Сыроежка Посмотреть сообщение
В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект.
Ты про operator<<? Смотрел, смотрел, но так и не понял, о какой "неконстантной ссылке" ты говоришь. MyBool там по значению передаётся.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.08.2011, 19:20     Возможно ли это на с++? #44
Цитата Сообщение от Сыроежка Посмотреть сообщение
В операторе вывода в качестве параметра принимается ссылка на объект, а не константная ссылка на объект. Поэтому после применения этого оператора ничего нельзя сказать о состоянии объекта.
вы не поверите, но даже в случае константной ссылки ничего нельзя уверенно сказать про объект
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2011, 19:46     Возможно ли это на с++?
Еще ссылки по теме:

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

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

как можно сделать это? если вообще возможно (не задача) - C++
есть задача, на двумерный массив... вывел массив 5х5 с рандомными числами, нужно найти числа локального минимума, т.е. чтоб число было...

_TCHAR szTestString[] = как сделать тут ввод с клавиатуры и возможно ли это - C++
Вот текст программы // Osi.cpp: определяет точку входа для консольного приложения. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

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


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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
08.08.2011, 19:46     Возможно ли это на с++? #45
Цитата Сообщение от Сыроежка Посмотреть сообщение
Класс написан очень плохо. Во-первых...
Я ж говорю - быдлокод. Вопрос был "возможно ли это на С++", я показал, что возможно, и не более того.
Yandex
Объявления
08.08.2011, 19:46     Возможно ли это на с++?
Ответ Создать тему
Опции темы

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