ネタ元はこちら→SQLで最小の空き番号を取得する方法
つまりはクロークのおねえさん。
荷物を預かるたびに番号札の若いものから渡し、
荷物と引き換えに番号札を回収する、と。
# 番号札は1からの連番で無限に持ってる、と。
こしらえてみました。
#include <set>
class cloak {
private:
typedef std::set<int> tags_type;
tags_type tags_;
public:
cloak();
~cloak();
// 次に配るはずの札
int peek() const;
// 札を配る
int acquire();
// 札を返却する(配った覚えのない札ならfalse)
bool release(int n);
// すべての札を返却する
void clear();
// 配った札一覧
template<typename Iterator>
Iterator acquired(Iterator out) const;
// 返却された札一覧
template<typename Iterator>
Iterator released(Iterator out) const;
};
/*
* ここにcloakの実装。な・い・しょ♪
*/
#include <iostream>
#include <iterator>
#include <cassert>
int main() {
cloak c;
assert( 1 == c.peek() ); // 次は1をくれるハズ
assert( 1 == c.acquire() ); // 1をもらう
assert( 2 == c.acquire() ); // 2をもらう
assert( 3 == c.acquire() ); // 3をもらう
assert( 4 == c.peek() ); // 4をくれる
assert( c.release(2) ); // 2を返す
assert( 2 == c.peek() ); // 次は2をくれるハズ
assert( !c.release(2) ); // 2は返せない
assert( !c.release(5) ); // 5も返せない
assert( c.release(1) ); // 1を返す
assert( 1 == c.acquire() ); // 1をもらう
std::ostream_iterator<int> out(std::cout," ");
c.acquired(out);
std::cout << std::endl;
c.released(out);
std::cout << std::endl;
}
# 誰かさんが腕試しネタを欲しがってるらしいのだな ^^;