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

Класс "Множество символов" - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Линейный список. Добавление в начало списка элементов http://www.cyberforum.ru/cpp-beginners/thread401085.html
Есть задача: - представить таблицу в виде линейного списка - организовать добавление элементов - исключение элементов из списка - просмотр списка - и добавление элементов в начало списка. Все...
C++ byte arr to int int i; byte arr = {0x31,0x31,0x31,0x31,0x31}; нужно из массива arr пoлучить i=11111; как это зделать? Добавлено через 11 часов 6 минут еще актуально http://www.cyberforum.ru/cpp-beginners/thread401079.html
При попытке компиляции на ноутбуке вылезает данная ошибка. Что это? C++
Вот текст ошибки. Причем на чужом ноуте компилилось нормально, здесь вдруг траблы какие-то. С опасностью я понимаю, а вот с ерорами не очень как-то... 1>------ Build started: Project: Programm...
C++ Бинарное дерево по первой букве Список с простым перебором
Помогите пожалуйста написать программу которая бы сообщала среднее число коллизий и среднее количество сравнений, выполненных для поиска идентификатора. Тип хеш функции -Бинарное дерево по первой...
C++ Переход от статического к динамическому массиву http://www.cyberforum.ru/cpp-beginners/thread401056.html
Есть некая структура some_struct. Необходимо перейти от статического массива этих структур some_struct *Table; к динамическому some_struct *Table =...
C++ Что лучше Visual studio 2010 C++ или Builder 6 C++ ? Только что начал программировать на C++, и не хотелось бы потом переучиваться на другую среду программирования, так что пожалуйста, подскажите где лучше программировать, выгодней и на какой среде... подробнее

Показать сообщение отдельно
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
09.12.2011, 14:32
Внимание! Имел я в виду "писать программу, управляемую через меню (в текстовом режиме)" и оформление "в виде двух файлов: заголовочного файла с объявлением класса и файла реализации".

Так же не ясно, что такое "подсчет ссылок" еще и для "минимизации копирования". Имеется в виду количество инстанцированных классов?

Вот класс и пример его работы.
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <string>
#include <iostream>
 
class SetOfChar {
 public:
  SetOfChar() {
    clear();
  }
  SetOfChar(const SetOfChar &other) {
    copyFrom(other);
  }
  SetOfChar &operator=(const SetOfChar &other) {
    if (&other != this)
      copyFrom(other);
    return *this;
  }
  SetOfChar &operator<<(unsigned char value) {
    data_[value / 8] |= 1 << (value % 8);
    return *this;
  }
  SetOfChar &operator>>(unsigned char value) {
    data_[value / 8] &= ~(1 << (value % 8));
    return *this;
  }
  bool operator[](unsigned char value) const {
    return has(value);
  }
  SetOfChar operator&(const SetOfChar &other) {
    return intercectionWith(other);
  }
  SetOfChar operator|(const SetOfChar &other) {
    return unionWith(other);
  }
  bool operator<(const SetOfChar &other) {
    return isSubsetOf(other);
  }
  bool operator>(const SetOfChar &other) {
    return other.isSubsetOf(*this);
  }
  SetOfChar intercectionWith(const SetOfChar &other) const {
    SetOfChar result;
    for (unsigned char i = 0; i < 32; ++i)
      result.data_[i] = data_[i] & other.data_[i];
    return result;
  }
  SetOfChar unionWith(const SetOfChar &other) const {
    SetOfChar result;
    for (unsigned char i = 0; i < 32; ++i)
      result.data_[i] = data_[i] | other.data_[i];
    return result;
  }
  bool isSubsetOf(const SetOfChar &other) const {
    for (unsigned char i = 0; i < 32; ++i)
      if (((data_[i] & other.data_[i]) ^ data_[i]) != 0)
        return false;
    return true;
  }
  bool operator==(const SetOfChar &other) const {
    return equalsTo(other);
  }
  bool equalsTo(const SetOfChar &other) const {
    for (unsigned char i = 0; i < 32; ++i)
      if (data_[i] != other.data_[i])
        return false;
    return true;
  }
  bool has(unsigned char value) const {
    return ((data_[value / 8] & (1 << (value % 8))) != 0);
  }
  bool isEmpty() const {
    for (size_t i = 0; i < 32; ++i)
      if (data_[i] != 0)
        return false;
    return true;
  }
  void clear() {
    for (size_t i = 0; i < 32; ++i)
      data_[i] = 0;
  }
  void copyFrom(const SetOfChar &other) {
    for (size_t i = 0; i < 32; ++i)
      data_[i] = other.data_[i];
  }
 private:
  unsigned char data_[32];
};
 
std::ostream &operator<<(std::ostream &stream, const SetOfChar &set) {
  for (unsigned char i = 0; i < 255; ++i)
    if (set[i])
      stream << static_cast<int>(i) << " ";
  return stream;
}
 
int main(int argc, char *argv[]) {
  SetOfChar a, b, c;
  a << 1 << 2 << 4 << 6;
  b << 2 << 3 << 5 << 6;
  c = (a | b);
 
  std::cout << "a: " << a << std::endl << "b: " << b << std::endl <<
    "c: " << c << std::endl;
  std::cout << "Union: " << (a | b) << std::endl;
  std::cout << "Intersection: " << (a & b) << std::endl;
  std::cout << "C includes A: " << ((c > a) ? "yes" : "no") << std::endl;
  std::cout << "C includes B: " << ((c > b) ? "yes" : "no") << std::endl;
  std::cout << "A includes B: " << ((a > b) ? "yes" : "no") << std::endl;
  std::cout << "A equals to B: " << ((a == b) ? "yes" : "no") << std::endl;
  return 0;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru