的(guess
,correct
)pair
S(或struct
多個)std::vector
。
遞增correct
(二進制?)搜索正確的點,在正確的猜測和新的點之間滑動元素1.可能滑入「叢」會比一次滑動一個元素快,但可能不會。
std::vector< std::pair< int, std::size_t > > guess_buffer;
template<typename TryGuess>
bool Try(guess_buffer& guesses, TryGuess const& try_guess) {
for (guess_buffer::iterator it = guesses.begin(); it != guesses.end(); ++it) {
if (try_guess(it->first)) {
it->second++;
while (it != guesses.begin()) {
--it;
if (it->second < (it+1)->second) {
std::swap(*it, *(it+1));
} else {
return true;
}
}
return true;
}
}
return false;
}
鑑於您已經從開始到這裏迭代,搜索和幻燈片將足夠快。迭代的局部性和速度將彌補兩個整數的幻燈片成本。
如果你想要更少的代碼,從計數到猜測的多重映射,迭代記憶迭代器,如果成功通過迭代器刪除,增加計數,並重新插入。可能會變慢。
template<typename X>
struct reverse_order {
template<typename T, typename U>
bool operator()(T const& t, U const& u) const {
return std::less<X>()(u, t);
}
};
typedef std::multi_map< std::size_t, int, reverse_order<std::size_t> > guess_map;
template<typename TryGuess>
bool Try(guess_map& guesses, TryGuess const& try_guess) {
for(guess_map::iterator it = guesses.begin(); it != guesses.end(); ++it) {
if(try_guess(it->second))
{
std::pair<std::size_t, int> modify = *it;
guesses.erase(it);
modify.first++;
guesses.insert(modify);
return true;
}
}
return false;
}
只使用一個陣列,並保持它排序在每次迭代 – yngccc 2013-04-25 20:01:41
聽起來像一個升壓[bimap的](http://www.boost.org/doc/libs/release/libs/bimap/doc/html/ index.html)可能適合您的需求。 – 2013-04-25 20:03:53