Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
1

vector<bool> утверждение

16.09.2011, 22:26. Просмотров 1658. Ответов 15
Метки нет (Все метки)

друзья! Страутструп утверждает что проще пареной репы. подскажите как? что то в голову не идет.
Как сделать так чтобы элемент вектор бул занимал всего 1 бит

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Миниатюры
vector<bool> утверждение  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2011, 22:26
Ответы с готовыми решениями:

bool vector
#include &lt;iostream&gt; using namespace std; #include &lt;vector&gt; int main() {...

Vector<bool> и visual c++
Приветствую, пытаюсь адаптировать консольный исходник алгоритма Хаффмана в...

vector<vector <bool> >
vector&lt;vector &lt;bool&gt; &gt; v1; bool v2 = { {1,1}, {1,1}, }; как v1...

Ошибка при использовании vector<bool>
Текст ошибки (Visual studio 2013): Ошибка 2 error C2440: return: невозможно...

Упаковка std :: vector <bool> в байты
Добрый Вечер! возникла проблема: нужно элементы std::vector&lt;bool&gt;...

15
bambino
194 / 20 / 5
Регистрация: 05.08.2010
Сообщений: 229
16.09.2011, 22:40 2
AzaKendler,
In this template specialization, each element occupies only one bit (which is eight times less than the smallest type in C++: char).
http://www.cplusplus.com/reference/stl/vector/
0
sandye51
программист С++
834 / 593 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
16.09.2011, 22:50 3
Цитата Сообщение от AzaKendler Посмотреть сообщение
Как сделать так чтобы элемент вектор бул занимал всего 1 бит
использовать массив блоков в самом классе, он представляем собой последовательность битов, к каждому биту которой можно обращаться через побитовые операции
например в случае типа char каждый блок это 8 бит
0
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.09.2011, 22:54  [ТС] 4
каков sizejf(bool) - 1 байт? каким образом адресуется только 1 бит, да еще если это все лежит в контейнере. за определениями не вижу реализации. это е мало о чем сказало.

если я например делаю однобайтную структуру то могу разбить его внутри на биты. но размер поля в любом случае будет 1 байт. вот мне и непонятно. как реализовано в векторе? например есть структурка типа бул, она разбита каждая на 8 бит. как реализован оператор [] в данном случае чтоб я мог пробраться к значению поля

Добавлено через 2 минуты
sandye51, распиши плиз коротенько. в 2х словах твое видение. например оператор [].
какая битовая операция должна будет использоваться.

C++
1
2
3
4
5
vector<bool> vec (155);
 
vec [45] = true;
 
bool triger = vec[45];
0
bambino
194 / 20 / 5
Регистрация: 05.08.2010
Сообщений: 229
16.09.2011, 22:55 5
Цитата Сообщение от AzaKendler Посмотреть сообщение
каков sizejf(bool) - 1 байт?
sizeof(bool) are implementation-defined.
0
sandye51
программист С++
834 / 593 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
16.09.2011, 22:55 6
например есть массив char b[5];
всего элементов значит 8 * 5 = 40;
вопрос, как установить 25-ый бит?
s = 25 % 8 = 1;
m = 25 / 8 = 3;
значит надо в 3 байте установить первый бит
char tmp = 1;
tmp << s;
b[m] |= s;
получили что хотели.
считать тоже просто
1
iama
1326 / 979 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
16.09.2011, 22:56 7
bitset
0
sandye51
программист С++
834 / 593 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
16.09.2011, 23:00 8
Цитата Сообщение от iama Посмотреть сообщение
bitset
boost::dymanic_bitset
0
iama
1326 / 979 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
16.09.2011, 23:04 9
sandye51, не всегда есть boost, а простой bitset - гарантированно будет.
0
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.09.2011, 23:21  [ТС] 10
да блин парни. просто понять смысл хочу. не надо про битсет и про буст. вопрос в том чтобы понять как оно работает


s = 25 % 8 = 1;
m = 25 / 8 = 3;
значит надо в 3 байте установить первый бит
char tmp = 1;
tmp << s;
s,m это int?

tmp << s - что куда двигаем. это tmp = tmp<<s?

Добавлено через 16 минут
ладно. наверное все спят уже. спасибо за пример
0
iama
1326 / 979 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
16.09.2011, 23:25 11
AzaKendler, блин, ну что тут не понятного-то? Сначала находим номер байта, в котором лежит нужный бит (m), находим, каким будет этот бит в байте (s), и побитовым или "включаем" его.
1
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.09.2011, 23:31  [ТС] 12
iama, напиши плиз полный пример или его прокомментируй. я там с типами не могу понять.

Добавлено через 1 минуту
а все дошло. благожарю
0
List2006
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
16.09.2011, 23:44 13
один бит?
C++
1
2
3
4
struct mybool
{
    unsigned int b : 1 // будет занимать 1 бит (не байт)
};
0
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.09.2011, 23:48  [ТС] 14
List2006, а сама структура то будет небось 4 байта весить?
0
Jupiter
Каратель
Эксперт С++
6570 / 3991 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.09.2011, 00:10 15
Цитата Сообщение от AzaKendler Посмотреть сообщение
List2006, а сама структура то будет небось 4 байта весить?
да, но в С++(03) в отличии от С(89) можно написать так
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
struct mybool
{
    unsigned char b : 1; 
};
 
int main()
{
   std::cout << sizeof(mybool);
}
и структура будет занимать 1 байт, другое дело что при таком раскладе нужно чаще будет производить реаллокацию
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
17.09.2011, 00:28 16
Лучший ответ Сообщение было отмечено как решение

Решение

первое что пришло в голову

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
#include <cstdlib>
#include <iostream>
 
class vec;
 
class vec
{
public:
  vec(char val) : m_val(val) {}
  class ref
  {
  public:
     friend class vec; 
     operator bool()
     { 
        return m_vec->get(m_el); 
     }
     void operator=(bool b)
     {
        m_vec->set(m_el, b); 
     }
  private:
     ref( vec* v, size_t el ) : m_vec(v), m_el(el) {}  
     vec* m_vec;
     size_t m_el;    
  };   
  ref operator[](size_t el) 
  { 
     return ref(this,el);
  }
private:
  bool get(size_t el) 
  { 
     return m_val & (1 << el) ? true : false; 
  }
  void set(size_t el, bool val) 
  {
      /* 
      std::cout << (int)m_val << '(' 
                << el << " -> " << val << ')' 
                << std::endl; 
      */ 
      m_val = (~(1 << el)) & m_val | (val << el); 
      /*
      std::cout << (int)m_val << std::endl;  
      */ 
  } 
  char m_val;
};
 
void print(vec& v)
{
   for (int i=7;i>=0;--i)
   {
      std::cout << (bool)v[i];
   }   
   std::cout << std::endl; 
}
 
int main()
{
   vec v(23);
   print(v); 
   v[0] = false; 
   v[3] = true;  
   v[5] = true;
   v[7] = true; 
   bool val = v[2]; 
   print(v); 
}
Добавлено через 1 минуту
http://liveworkspace.org/code/f83b496b74649c3bb4752e7c9e8c7d15

на восемь bool - один char
3
17.09.2011, 00:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2011, 00:28

Vector <bool> erase iterator outside range
Помогите, пожалуйста. При компиляции появляется ошибка (фото ниже). Это...

Примерная реализация std vector bool
добрый вечер, не могу найти в сети реализацию st::vector&lt;bool&gt; - есть у кого...

Как в vector поместить double, bool?
#include &lt;stdio.h&gt; #include &lt;vector&gt; using namespace std; void main() { ...


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

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

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