Use std::deque instead of std::list in IndexedList

We choose faster iteration over rare slower deletion in the middle.
This commit is contained in:
Tatsuhiro Tsujikawa 2012-12-22 19:29:27 +09:00
parent 643e7222b0
commit 561f0b3e29
5 changed files with 205 additions and 84 deletions

View file

@ -22,6 +22,7 @@ class IndexedListTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testMove);
CPPUNIT_TEST(testGet);
CPPUNIT_TEST(testInsert);
CPPUNIT_TEST(testInsert_keyFunc);
CPPUNIT_TEST_SUITE_END();
public:
void setUp()
@ -34,6 +35,7 @@ public:
void testMove();
void testGet();
void testInsert();
void testInsert_keyFunc();
};
CPPUNIT_TEST_SUITE_REGISTRATION( IndexedListTest );
@ -203,9 +205,57 @@ void IndexedListTest::testGet()
list.push_back(1, &b);
CPPUNIT_ASSERT_EQUAL((int*)0, list.get(1000));
CPPUNIT_ASSERT_EQUAL(&a, list.get(123));
}
CPPUNIT_ASSERT(list.begin() == list.find(123));
CPPUNIT_ASSERT(list.end() == list.find(124));
namespace {
struct KeyFunc {
int n;
KeyFunc(int n):n(n) {}
int operator()(const SharedHandle<std::string>& x)
{
return n++;
}
};
} // namespace
void IndexedListTest::testInsert_keyFunc()
{
SharedHandle<std::string> s[] = {
SharedHandle<std::string>(new std::string("a")),
SharedHandle<std::string>(new std::string("b")),
SharedHandle<std::string>(new std::string("c")),
SharedHandle<std::string>(new std::string("d"))
};
size_t slen = sizeof(s)/sizeof(s[0]);
IndexedList<int, SharedHandle<std::string> > list;
list.insert(list.begin(), KeyFunc(0), vbegin(s), vend(s));
CPPUNIT_ASSERT_EQUAL((size_t)slen, list.size());
for(size_t i = 0; i < slen; ++i) {
CPPUNIT_ASSERT_EQUAL(*s[i], *list.get(i));
}
list.insert(list.begin()+2, KeyFunc(slen), vbegin(s), vend(s));
CPPUNIT_ASSERT_EQUAL((size_t)slen*2, list.size());
for(size_t i = slen; i < slen*2; ++i) {
CPPUNIT_ASSERT_EQUAL(*s[i - slen], *list.get(i));
}
IndexedList<int, SharedHandle<std::string> >::SeqType::iterator itr;
itr = list.begin();
CPPUNIT_ASSERT_EQUAL(std::string("a"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("b"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("a"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("b"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("c"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("d"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("c"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("d"), *(*itr++).second);
list.insert(list.begin(), KeyFunc(2*slen-1), vbegin(s), vend(s));
CPPUNIT_ASSERT_EQUAL((size_t)slen*3-1, list.size());
itr = list.begin();
CPPUNIT_ASSERT_EQUAL(std::string("b"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("c"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("d"), *(*itr++).second);
CPPUNIT_ASSERT_EQUAL(std::string("a"), *(*itr++).second);
}
void IndexedListTest::testInsert()