Анализ set<int>
От: Аноним  
Дата: 08.12.05 11:44
Оценка:
Как найти число пропущенных порядковых номеров в set<int> X;?

Например:

X={234,235,236,237} --- result = 0 // ничего не пропущено

X={14,16,19} --- result = 3 // так как пропущены 15,17,18

Спасибо за ответы.
Re: Анализ set<int>
От: Черепнин Сергей Украина  
Дата: 08.12.05 11:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как найти число пропущенных порядковых номеров в set<int> X;?


А>Например:


А>X={234,235,236,237} --- result = 0 // ничего не пропущено


А>X={14,16,19} --- result = 3 // так как пропущены 15,17,18


А>Спасибо за ответы




 // если размер X больше 1:
  int res = 0;
  std::set<int>::iterator it = X.begin();
  while(it != X.end())
  {
    res += (*(it+1) - *it);
    if(++it == X.end())
         break;
   
  }
Re: Анализ set<int>
От: valker  
Дата: 08.12.05 11:57
Оценка: 60 (8) +6
Здравствуйте, Аноним, Вы писали:

А>Как найти число пропущенных порядковых номеров в set<int> X;?


А>Например:


А>X={234,235,236,237} --- result = 0 // ничего не пропущено


А>X={14,16,19} --- result = 3 // так как пропущены 15,17,18


А>Спасибо за ответы.


Видимо, взять разницу между расстоянием от большего до меньшего и размером контейнера...
Re: Анализ set<int>
От: Greg Zubankov СССР  
Дата: 08.12.05 12:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как найти число пропущенных порядковых номеров в set<int> X;?


А>Например:


А>X={234,235,236,237} --- result = 0 // ничего не пропущено


А>X={14,16,19} --- result = 3 // так как пропущены 15,17,18


А>Спасибо за ответы.


std::set<int> ms;
if(ms.size() <= 1)
return 0;
else
return (*--ms.end() — *ms.begin()) — (ms.size() — 1);
Re[2]: Анализ set<int>
От: Шахтер Интернет  
Дата: 08.12.05 12:01
Оценка: +1 :)
Здравствуйте, Черепнин Сергей, Вы писали:

ЧС>Здравствуйте, Аноним, Вы писали:


А>>Как найти число пропущенных порядковых номеров в set<int> X;?


А>>Например:


А>>X={234,235,236,237} --- result = 0 // ничего не пропущено


А>>X={14,16,19} --- result = 3 // так как пропущены 15,17,18


А>>Спасибо за ответы




ЧС>
ЧС> // если размер X больше 1:
ЧС>  int res = 0;
ЧС>  std::set<int>::iterator it = X.begin();
ЧС>  while(it != X.end())
ЧС>  {
ЧС>    res += (*(it+1) - *it);
ЧС>    if(++it == X.end())
ЧС>         break;
   
ЧС>  }
ЧС>


Мда. Здесь неправильно сделано почти всё, что можно неправильно сделать.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Анализ set<int>
От: Кодт Россия  
Дата: 08.12.05 13:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как найти число пропущенных порядковых номеров в set<int> X;?


X.empty() ? 0 : (X.back()-X.front())-X.size()
Перекуём баги на фичи!
Re[2]: Анализ set<int>
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 08.12.05 13:53
Оценка: 38 (2)
Здравствуйте, Кодт, Вы писали:

А>>Как найти число пропущенных порядковых номеров в set<int> X;?


К>X.empty() ? 0 : (X.back()-X.front())-X.size()


Акелла промахнулся ?

У set вроде ж нет front()/back()?

я делал так:

size_t size = x.size();
return size ? (*x.rbegin() - *x.begin() - size) : 0;
Re[3]: Анализ set<int>
От: Greg Zubankov СССР  
Дата: 08.12.05 13:54
Оценка: +1
Здравствуйте, BitField, Вы писали:

BF>я делал так:


BF>
BF>size_t size = x.size();
BF>return size ? (*x.rbegin() - *x.begin() - size) : 0;

BF>


Размер должен быть меньше на 1. Ибо не сойдется
Re[4]: Анализ set<int>
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 08.12.05 13:59
Оценка:
Здравствуйте, Greg Zubankov, Вы писали:

GZ>Размер должен быть меньше на 1. Ибо не сойдется


Да, я тоже промахнулся. Спасибо!
BF>>
BF>>size_t size = x.size();
BF>>return size ? (*x.rbegin() - *x.begin() - size + 1) : 0;
//или return size ? (*x.rbegin() - *x.begin() - (size - 1)) : 0;
BF>>
Re[3]: Анализ set<int>
От: Bell Россия  
Дата: 08.12.05 13:59
Оценка: 1 (1) +2
Здравствуйте, BitField, Вы писали:

BF>Акелла промахнулся ?




BF>
BF>size_t size = x.size();
BF>return (size > 1) ? (*x.rbegin() - *x.begin() - size - 1) : 0;

BF>

Любите книгу — источник знаний (с) М.Горький
Re[3]: Анализ set<int>
От: Кодт Россия  
Дата: 08.12.05 14:24
Оценка:
Здравствуйте, BitField, Вы писали:

BF>Акелла промахнулся ?

BF>У set вроде ж нет front()/back()?

Угу. *begin(), *rbegin()
Перекуём баги на фичи!
Re[4]: Анализ set<int>
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 08.12.05 14:28
Оценка: 1 (1)
Здравствуйте, Bell, Вы писали:

BF>>Акелла промахнулся ?

B>

Что-то к вечеру все думать перестали:

size_t size = x.size();
return (size > 1) ? (*x.rbegin() - *x.begin() - size + 1) : 0;



Проверка:
1, 2, 3, 5 => 5 - 1 - 4 + 1 => 1

ЗЫ. А оптимизация красивая! +1
Re[5]: Анализ set<int>
От: Bell Россия  
Дата: 08.12.05 14:35
Оценка:
Здравствуйте, BitField, Вы писали:

BF>Что-то к вечеру все думать перестали:

Нет — это просто пальцы за мыслью не успевают — скобочки вокруг (size — 1) не вставились

Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.