std::vector
( , )的pair
s (或struct
s) 个。guess
correct
增量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;
}