аналог вхождения во множество in [1,2,3,4] в C++
От: dvp2705  
Дата: 29.07.03 06:11
Оценка:
в паскале можно написать

a: set of 1..250;

a:=[1,3,5,7,90..100];
b:=48;
if b in a then
....
else
...

есть ли какой нибудь аналог в C++ (мож через enum?)
Re: аналог вхождения во множество in [1,2,3,4] в C++
От: UnrealAlex Россия  
Дата: 29.07.03 06:27
Оценка:
Здравствуйте, dvp2705, Вы писали:

D>в паскале можно написать


D>a: set of 1..250;


D>a:=[1,3,5,7,90..100];

D>b:=48;
D>if b in a then
D>....
D>else
D>...

D>есть ли какой нибудь аналог в C++ (мож через enum?)

std::set
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re: аналог вхождения во множество in [1,2,3,4] в C++
От: Yacha Россия  
Дата: 29.07.03 06:27
Оценка:
Здравствуйте, dvp2705, Вы писали:

D>в паскале можно написать


D>a: set of 1..250;


D>a:=[1,3,5,7,90..100];

D>b:=48;
D>if b in a then
D>....
D>else
D>...

D>есть ли какой нибудь аналог в C++ (мож через enum?)

Можно например сделать так
int aInit[] = {1, 3, 5, 7};
std::set<int> a(aInt, aInt + 4);
if(a.find(48) != a.end())
{
//...
}
else
{
//...
}
... << RSDN@Home 1.0 beta 6a >>
Re: аналог вхождения во множество in [1,2,3,4] в C++
От: Павел Кузнецов  
Дата: 29.07.03 07:17
Оценка: 5 (2)
Здравствуйте, dvp2705, Вы писали:

d> в паскале можно написать


d> a: set of 1..250;


d> a:=[1,3,5,7,90..100];

d> b:=48;
d> if b in a then
d> ....
d> else
d> ...

d> есть ли какой нибудь аналог в C++ (мож через enum?)


Ближайший аналог — std::bitset:

std::bitset<250> a;
a.set(1);
a.set(3);
a.set(5);
a.set(7);
a.set(90);
a.set(100);

if (a.test(48))
{
  ...
}
else
{
  ...
}
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: аналог вхождения во множество in [1,2,3,4] в C++
От: Кодт Россия  
Дата: 29.07.03 07:24
Оценка:
Здравствуйте, dvp2705, Вы писали:

D>есть ли какой нибудь аналог в C++ (мож через enum?)


1) битовые операции языка C. (диапазон — [0, 8*sizeof(int)) ).
enum {
  _first_ = 1<<0,
  _second_ = 1<<1,
  _third_ = 1<<2,
  ...
};

unsigned flags = _first_ | _third_;

if( flags & _second_ )
  printf("It has second!");

if( flags & (_first_|_second_) )
  printf("It has first or second");

if( flags & (_first_|_second_) == (_first_|_second_) )
  printf("It has both first and second");

//////////////////////////////////////////////////////

typedef byte num_t; // 0..31
typedef unsigned bitset_t;

bitset_t n2set(num_t n) { return 1<<n; }

bool belongs(num_t n, bitset_t s) { return n2set(n) & s; }
bool subset(bitset_t a, bitset_t b) { return (a & b) == a; } // a is a subset of b


2) std::set<int> -- множество целых чисел.
Не самое эффективное хранилище, однако!

3) std::vector<bool> плюс обвеска к нему.
Перекуём баги на фичи!
Re[2]: аналог вхождения во множество in [1,2,3,4] в C++
От: dvp2705  
Дата: 29.07.03 07:37
Оценка:
Здравствуйте, Yacha, Вы писали:

Y>Здравствуйте, dvp2705, Вы писали:


D>>в паскале можно написать


D>>a: set of 1..250;


D>>a:=[1,3,5,7,90..100];

D>>b:=48;
D>>if b in a then
D>>....
D>>else
D>>...

D>>есть ли какой нибудь аналог в C++ (мож через enum?)

Y>Можно например сделать так
Y>
Y>int aInit[] = {1, 3, 5, 7};
Y>std::set<int> a(aInt, aInt + 4);
Y>if(a.find(48) != a.end())
Y>{
Y>//...
Y>}
Y>else
Y>{

Y>//...
Y>}
Y>


остановился на этом варианте, вроде работает но:
Y>std::set<int> a(aInt, aInt + 4);
4 — это число элементов в массиве?
если a.find(48) != a.end() значит элемент входит во множество?
Re[2]: аналог вхождения во множество in [1,2,3,4] в C++
От: Другой Аноним  
Дата: 29.07.03 07:41
Оценка: 1 (1)
Здравствуйте, Павел Кузнецов, Вы писали:

d>> a: set of 1..250;

d>> a:=[1,3,5,7,90..100];
d>> b:=48;


ПК>Ближайший аналог — std::bitset:


ПК>
ПК>std::bitset<250> a;
ПК>a.set(1);
ПК>a.set(3);
ПК>a.set(5);
ПК>a.set(7);
ПК>a.set(90);
a.set(91);
a.set(92);
//... И еще 7 значений...
ПК>a.set(100);
ПК>
Re[3]: аналог вхождения во множество in [1,2,3,4] в C++
От: Yacha Россия  
Дата: 29.07.03 07:42
Оценка:
Здравствуйте, dvp2705, Вы писали:

D>Здравствуйте, Yacha, Вы писали:


Y>>Здравствуйте, dvp2705, Вы писали:


D>>>в паскале можно написать


D>>>a: set of 1..250;


D>>>a:=[1,3,5,7,90..100];

D>>>b:=48;
D>>>if b in a then
D>>>....
D>>>else
D>>>...

D>>>есть ли какой нибудь аналог в C++ (мож через enum?)

Y>>Можно например сделать так
Y>>
Y>>int aInit[] = {1, 3, 5, 7};
Y>>std::set<int> a(aInt, aInt + 4);
Y>>if(a.find(48) != a.end())
Y>>{
Y>>//...
Y>>}
Y>>else
Y>>{

Y>>//...
Y>>}
Y>>


D>остановился на этом варианте, вроде работает но:

Y>>std::set<int> a(aInt, aInt + 4);
D>4 — это число элементов в массиве?
D>если a.find(48) != a.end() значит элемент входит во множество?
D>
Да, 4 это ко-во элементов в множестве.
find() вернет итератор на end, если элемент отсутствует в множестве.
Но мне кажется, Кодт и Павел Кузнецов, предлагают более правильное решение, если тебе необходимо битовое множество.
... << RSDN@Home 1.0 beta 6a >>
Re[3]: аналог вхождения во множество in [1,2,3,4] в C++
От: Павел Кузнецов  
Дата: 29.07.03 08:08
Оценка:
Здравствуйте, Другой Аноним, Вы писали:

ДА> Здравствуйте, Павел Кузнецов, Вы писали:


ДА>
d>>> a:=[1,3,5,7,90..100];
ДА>


ПК>>
ПК>> std::bitset<250> a;
ПК>> a.set(90);
ДА> a.set(91);
ДА> a.set(92);
ДА> //... И еще 7 значений...
ПК>> a.set(100);
ПК>>


Sorry... Действительно Спасибо.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.