⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unordered_test.cpp

📁 symbian 上的stl_port进过编译的。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  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 + -