📄 unordered_test.cpp
字号:
unordered_set<int> int_uset; CPPUNIT_ASSERT( int_uset.max_load_factor() == 1.0f ); CPPUNIT_ASSERT( int_uset.load_factor() == 0.0f ); size_t nbInserts = int_uset.bucket_count() - 1; for (int i = 0; (size_t)i < nbInserts; ++i) { int_uset.insert(i); } CPPUNIT_ASSERT( int_uset.size() == nbInserts ); int_uset.max_load_factor(0.5f); int_uset.rehash(0); CPPUNIT_ASSERT( int_uset.load_factor() < int_uset.max_load_factor() ); size_t bucketsHint = int_uset.bucket_count() + 1; int_uset.rehash(bucketsHint); CPPUNIT_ASSERT( int_uset.bucket_count() >= bucketsHint ); CPPUNIT_ASSERT( int_uset.key_eq()(10, 10) ); CPPUNIT_ASSERT( int_uset.hash_function()(10) == 10 );#endif}void UnorderedTest::buckets(){#if defined (STLPORT) unordered_set<int> int_uset; CPPUNIT_ASSERT( int_uset.bucket_count() < int_uset.max_bucket_count() ); int i; size_t nbBuckets = int_uset.bucket_count(); size_t nbInserts = int_uset.bucket_count() - 1; for (i = 0; (size_t)i < nbInserts; ++i) { int_uset.insert(i); } CPPUNIT_ASSERT( nbBuckets == int_uset.bucket_count() ); size_t bucketSizes = 0; for (i = 0; (size_t)i < nbBuckets; ++i) { bucketSizes += int_uset.bucket_size(i); } CPPUNIT_ASSERT( bucketSizes == int_uset.size() );#endif}void UnorderedTest::equal_range(){#if defined (STLPORT) && !defined (__DMC__) typedef unordered_multiset<size_t> umset; { //General test umset iumset; iumset.max_load_factor(10.0f); size_t nbBuckets = iumset.bucket_count(); for (size_t i = 0; i < nbBuckets; ++i) { iumset.insert(i); iumset.insert(i + nbBuckets); iumset.insert(i + 2 * nbBuckets); iumset.insert(i + 3 * nbBuckets); iumset.insert(i + 4 * nbBuckets); } CPPUNIT_ASSERT( nbBuckets == iumset.bucket_count() ); CPPUNIT_ASSERT( iumset.size() == 5 * nbBuckets ); pair<umset::iterator, umset::iterator> p = iumset.equal_range(1); CPPUNIT_ASSERT( p.first != p.second ); size_t nbElems = iumset.size(); nbElems -= distance(p.first, p.second); for (umset::iterator j = p.first; j != p.second;) { iumset.erase(j++); } CPPUNIT_ASSERT( nbElems == iumset.size() ); p = iumset.equal_range(2); CPPUNIT_ASSERT( p.first != p.second ); nbElems -= distance(p.first, p.second); iumset.erase(p.first, p.second); CPPUNIT_ASSERT( nbElems == iumset.size() ); } { //More specific test that tries to put many values in the same bucket umset iumset; size_t i; const size_t nbBuckets = iumset.bucket_count(); const size_t targetedBucket = nbBuckets / 2; //Lets put 10 values in the targeted bucket: for (i = 0; i < 10; ++i) { iumset.insert(targetedBucket + (i * nbBuckets)); } //We put again 10 values in the targeted bucket and in reverse order: for (i = 9; i <= 10; --i) { iumset.insert(targetedBucket + (i * nbBuckets)); } //Now we put some more elements until hash container is resized: i = 0; while (iumset.bucket_count() == nbBuckets) { iumset.insert(i++); } //CPPUNIT_ASSERT( iumset.bucket_size(targetedBucket) == 21 ); pair<umset::iterator, umset::iterator> p = iumset.equal_range(targetedBucket); CPPUNIT_ASSERT( p.first != p.second ); CPPUNIT_ASSERT( distance(p.first, p.second) == 3 ); } { srand(0); for (int runs = 0; runs < 2; ++runs) { size_t magic = rand(); umset hum; size_t c = 0; for (int i = 0; i < 10000; ++i) { if ((rand() % 500) == 0) { hum.insert(magic); ++c; } else { size_t r; while ((r = rand()) == magic); hum.insert(r); } /* if ((float)(hum.size() + 1) / (float)hum.bucket_count() > hum.max_load_factor()) { cout << "Hash container dump: Nb elems: " << hum.size() << ", Nb buckets: " << hum.bucket_count() << "\n"; for (size_t b = 0; b < hum.bucket_count(); ++b) { if (hum.bucket_size(b) != 0) { umset::local_iterator litBegin(hum.begin(b)), litEnd(hum.end(b)); cout << "B" << b << ": "; for (umset::local_iterator lit = litBegin; lit != litEnd; ++lit) { if (lit != litBegin) { cout << " - "; } cout << *lit; } cout << "\n"; } } cout << endl; } */ } CPPUNIT_ASSERT( hum.count(magic) == c ); } }#endif}struct Key{ Key() : m_data(0) {} explicit Key(int data) : m_data(data) {} int m_data;};struct KeyHash{ size_t operator () (Key key) const { return (size_t)key.m_data; } size_t operator () (int data) const { return (size_t)data; }};struct KeyEqual{ bool operator () (Key lhs, Key rhs) const { return lhs.m_data == rhs.m_data; } bool operator () (Key lhs, int rhs) const { return lhs.m_data == rhs; } bool operator () (int lhs, Key rhs) const { return lhs == rhs.m_data; }};struct KeyHashPtr{ size_t operator () (Key const volatile *key) const { return (size_t)key->m_data; } size_t operator () (int data) const { return (size_t)data; }};struct KeyEqualPtr{ bool operator () (Key const volatile *lhs, Key const volatile *rhs) const { return lhs->m_data == rhs->m_data; } bool operator () (Key const volatile *lhs, int rhs) const { return lhs->m_data == rhs; } bool operator () (int lhs, Key const volatile *rhs) const { return lhs == rhs->m_data; }};void UnorderedTest::template_methods(){#if defined (STLPORT) && defined (_STLP_USE_CONTAINERS_EXTENSION) { typedef unordered_set<Key, KeyHash, KeyEqual> Container; Container cont; cont.insert(Key(1)); cont.insert(Key(2)); cont.insert(Key(3)); cont.insert(Key(4)); CPPUNIT_ASSERT( cont.count(Key(1)) == 1 ); CPPUNIT_ASSERT( cont.count(1) == 1 ); CPPUNIT_ASSERT( cont.count(5) == 0 ); CPPUNIT_ASSERT( cont.find(2) != cont.end() ); CPPUNIT_ASSERT( cont.equal_range(2) != make_pair(cont.begin(), cont.end()) ); Container const& ccont = cont; CPPUNIT_ASSERT( ccont.find(2) != ccont.end() ); CPPUNIT_ASSERT( ccont.bucket(2) == ccont.bucket(2) ); CPPUNIT_ASSERT( ccont.equal_range(2) != make_pair(ccont.begin(), ccont.end()) ); } { typedef unordered_set<Key*, KeyHashPtr, KeyEqualPtr> Container; Container cont; Key key1(1), key2(2), key3(3), key4(4); cont.insert(&key1); cont.insert(&key2); cont.insert(&key3); cont.insert(&key4); CPPUNIT_ASSERT( cont.count(1) == 1 ); CPPUNIT_ASSERT( cont.count(5) == 0 ); CPPUNIT_ASSERT( cont.find(2) != cont.end() ); CPPUNIT_ASSERT( cont.equal_range(2) != make_pair(cont.begin(), cont.end()) ); Container const& ccont = cont; CPPUNIT_ASSERT( ccont.find(2) != ccont.end() ); CPPUNIT_ASSERT( ccont.bucket(2) == ccont.bucket(2) ); CPPUNIT_ASSERT( ccont.equal_range(2) != make_pair(ccont.begin(), ccont.end()) ); } { typedef unordered_multiset<Key, KeyHash, KeyEqual> Container; Container cont; cont.insert(Key(1)); cont.insert(Key(2)); cont.insert(Key(1)); cont.insert(Key(2)); CPPUNIT_ASSERT( cont.count(Key(1)) == 2 ); CPPUNIT_ASSERT( cont.count(1) == 2 ); CPPUNIT_ASSERT( cont.count(5) == 0 ); CPPUNIT_ASSERT( cont.find(2) != cont.end() ); CPPUNIT_ASSERT( cont.equal_range(1) != make_pair(cont.end(), cont.end()) ); Container const& ccont = cont; CPPUNIT_ASSERT( ccont.find(2) != ccont.end() ); CPPUNIT_ASSERT( ccont.bucket(2) == ccont.bucket(2) ); CPPUNIT_ASSERT( ccont.equal_range(2) != make_pair(ccont.end(), ccont.end()) ); } { typedef unordered_multiset<Key const volatile*, KeyHashPtr, KeyEqualPtr> Container; Container cont; Key key1(1), key2(2), key3(3), key4(4); cont.insert(&key1); cont.insert(&key2); cont.insert(&key3); cont.insert(&key4); CPPUNIT_ASSERT( cont.count(1) == 1 ); CPPUNIT_ASSERT( cont.count(5) == 0 ); CPPUNIT_ASSERT( cont.find(2) != cont.end() ); CPPUNIT_ASSERT( cont.equal_range(2) != make_pair(cont.begin(), cont.end()) ); Container const& ccont = cont; CPPUNIT_ASSERT( ccont.find(2) != ccont.end() ); CPPUNIT_ASSERT( ccont.bucket(2) == ccont.bucket(2) ); CPPUNIT_ASSERT( ccont.equal_range(2) != make_pair(ccont.begin(), ccont.end()) ); }#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -