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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.09.2011, 22:26     vector<bool> утверждение #1
друзья! Страутструп утверждает что проще пареной репы. подскажите как? что то в голову не идет.
Как сделать так чтобы элемент вектор бул занимал всего 1 бит
Миниатюры
vector<bool> утверждение  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2011, 22:26     vector<bool> утверждение
Посмотрите здесь:

не работает bool xor(bool a, bool b) C++
C++ vector<vector <bool> >
Как в vector поместить double, bool? C++
Ребята есть ли метод vector <bool> записать в бинарный файл? C++
C++ bool vector
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
16.09.2011, 22:40     vector<bool> утверждение #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/
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
16.09.2011, 22:50     vector<bool> утверждение #3
Цитата Сообщение от AzaKendler Посмотреть сообщение
Как сделать так чтобы элемент вектор бул занимал всего 1 бит
использовать массив блоков в самом классе, он представляем собой последовательность битов, к каждому биту которой можно обращаться через побитовые операции
например в случае типа char каждый блок это 8 бит
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.09.2011, 22:54  [ТС]     vector<bool> утверждение #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];
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
16.09.2011, 22:55     vector<bool> утверждение #5
Цитата Сообщение от AzaKendler Посмотреть сообщение
каков sizejf(bool) - 1 байт?
sizeof(bool) are implementation-defined.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
16.09.2011, 22:55     vector<bool> утверждение #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;
получили что хотели.
считать тоже просто
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
16.09.2011, 22:56     vector<bool> утверждение #7
bitset
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
16.09.2011, 23:00     vector<bool> утверждение #8
Цитата Сообщение от iama Посмотреть сообщение
bitset
boost::dymanic_bitset
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
16.09.2011, 23:04     vector<bool> утверждение #9
sandye51, не всегда есть boost, а простой bitset - гарантированно будет.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.09.2011, 23:21  [ТС]     vector<bool> утверждение #10
да блин парни. просто понять смысл хочу. не надо про битсет и про буст. вопрос в том чтобы понять как оно работает


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

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

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

Добавлено через 1 минуту
а все дошло. благожарю
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
16.09.2011, 23:44     vector<bool> утверждение #13
один бит?
C++
1
2
3
4
struct mybool
{
    unsigned int b : 1 // будет занимать 1 бит (не байт)
};
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.09.2011, 23:48  [ТС]     vector<bool> утверждение #14
List2006, а сама структура то будет небось 4 байта весить?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.09.2011, 00:10     vector<bool> утверждение #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 байт, другое дело что при таком раскладе нужно чаще будет производить реаллокацию
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2011, 00:28     vector<bool> утверждение
Еще ссылки по теме:

C++ Упаковка std :: vector <bool> в байты
C++ Ошибка при использовании vector<bool>
Vector<bool> и visual c++ C++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
17.09.2011, 00:28     vector<bool> утверждение #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/f83b49...752e7c9e8c7d15

на восемь bool - один char
Yandex
Объявления
17.09.2011, 00:28     vector<bool> утверждение
Ответ Создать тему
Опции темы

Текущее время: 08:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru