Чтобы добавить к предыдущим ответам, вот простой сравнительный тест, сравнивающий unordered_set
с vector
/ find
и vector
/ binary_search
.
LiveДемо
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_set>
#include <random>
#include <boost/timer/timer.hpp>
std::random_device rd; // only used once to initialise (seed) engine
std::mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case)
std::uniform_int_distribution<int> uni(0, 6); // guaranteed unbiased
int fun()
{
/* return some integer */
return uni(rng);
}
const size_t nTries = 1000000;
int main()
{
volatile bool isFound;
{ // unordered_set
std::unordered_set<int> vals = {1,2,3,4,5,6};
{
boost::timer::auto_cpu_timer timer;
for(volatile size_t i=0; i<nTries; i++)
isFound = (vals.find(fun()) != vals.cend());
}
}
{ // vector
std::vector<int> vals = {1,2,3,4,5,6};
{
boost::timer::auto_cpu_timer timer;
for(volatile size_t i=0; i<nTries; i++)
isFound = (std::find(vals.cbegin(), vals.cend(), fun()) != vals.cend());
}
}
{ // vector, binary search
std::vector<int> vals = {1,2,3,4,5,6};
std::sort (vals.begin(), vals.end());
{
boost::timer::auto_cpu_timer timer;
for(volatile size_t i=0; i<nTries; i++)
isFound = std::binary_search (vals.cbegin(), vals.cend(), fun());
}
}
return 0;
}
Числа сильно различаются, и gcc и clang ведут себя по-разному, но кажется, что использование unordered_set
- безопасная ставка.