На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> Элементы контейнера vector<bool> , указатели и ссылки на элементы vector<bool>
    Известно, что vector<bool> -- это специализация vector, в которой используется побитовая адресация. Т.е. имитируется адресация одного бита. В то же время, обычный указатель не может адресовать единицу памяти, меньшую чем байт. Это влечёт некоторые последствия. Например, нельзя рассматривать bool* как итератор для vector<bool>, а следующий код, который корректен для всех векторов, кроме vector<bool>, не будет компилироваться:
    ExpandedWrap disabled
      vector <bool> v;
      bool *pBool = &v[0];

    Однажды я столкнулся с проблемой ссылок и указателей на элементы vector<bool>. Сейчас я расскажу, как я вышел из ситуации.
    В разрабатываемом мной приложении был класс, содержащий vector<bool> в секции private. Для чтения элементов этого вектора использовался оператор []:
    ExpandedWrap disabled
      class BitSet {
      private:
         std::vector<bool> rep;
      public:
         explicit BitSet(const unsigned size): rep(size) {}
         bool operator[](const unsigned i) const;
      };
       
      bool BitSet::operator[](const unsigned i) const {
         return rep[i];
      }

    Проблема проявила себя, когда я захотел использовать [] для записи в rep. Сначала я написал так
    ExpandedWrap disabled
      bool& BitSet::operator[](const unsigned i) {
         return rep[i];
      }

    что, естественно, оказалось неправильно. Т.к. bool& и ссылка на элемент vector<bool> это разные типы.
    Выход из ситуации следующий
    ExpandedWrap disabled
      std::vector<bool>::reference BitSet::operator[](const unsigned i) {
         return rep[i];
      }

    std::vector<bool>::reference это прокси-класс, который ведет себя как ссылка на бит.
    Теперь в коде, использующем класс BitSet, можно было написать
    ExpandedWrap disabled
      BitSet bs(100);
      bs[0]=true;
      bs[1]=bs[0];

    Получить указатель на элемент vector<bool> можно следующим образом
    ExpandedWrap disabled
         std::vector<bool>::reference* p = &rep[2];
         *p = true;

    Однако, std::vector<bool>::reference* по-прежнему нельзя рассматривать как итератор для vector<bool>
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0575 ]   [ 16 queries used ]   [ Generated: 20.04.24, 01:53 GMT ]