📄 mvctor_test.cpp
字号:
{ //2 values in back: vect_deque.insert(vect_deque.end() - 2, 2, vector<int>(10)); bufs.insert(bufs.end() - 2, &vect_deque[20].front()); bufs.insert(bufs.end() - 2, &vect_deque[21].front()); CPPUNIT_ASSERT( vect_deque.size() == 24 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { //1 value in front: deque<vector<int> >::iterator ret; ret = vect_deque.insert(vect_deque.begin() + 2, vector<int>(10)); bufs.insert(bufs.begin() + 2, &vect_deque[2].front()); CPPUNIT_ASSERT( vect_deque.size() == 25 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) CPPUNIT_ASSERT( &ret->front() == bufs[2] ); deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { //1 value in back: deque<vector<int> >::iterator ret; ret = vect_deque.insert(vect_deque.end() - 2, vector<int>(10)); bufs.insert(bufs.end() - 2, &vect_deque[23].front()); CPPUNIT_ASSERT( vect_deque.size() == 26 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) CPPUNIT_ASSERT( &ret->front() == bufs[23] ); deque<vector<int> >::iterator dit(vect_deque.begin()), ditEnd(vect_deque.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } }}void MoveConstructorTest::vector_test(){#if !defined (__DMC__) //Check the insert range method. //To the front: { vector<vector<int> > vect_vector; vector<int*> bufs; vect_vector.assign(3, vector<int>(10)); bufs.push_back(&vect_vector[0].front()); bufs.push_back(&vect_vector[1].front()); bufs.push_back(&vect_vector[2].front()); int nb_insert = 5; int pos = 1; while (nb_insert--) { vector<vector<int> > vect_vect(2, vector<int>(10)); vect_vector.insert(vect_vector.begin() + pos, vect_vect.begin(), vect_vect.end()); bufs.insert(bufs.begin() + pos, &vect_vector[pos].front()); bufs.insert(bufs.begin() + pos + 1, &vect_vector[pos + 1].front()); ++pos; } CPPUNIT_ASSERT( vect_vector.size() == 13 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) for (int i = 0; i < 5; ++i) { CPPUNIT_ASSERT( bufs[i] == &vect_vector[i].front() ); CPPUNIT_ASSERT( bufs[11 - i] == &vect_vector[11 - i].front() ); }#endif } //To the back { vector<vector<int> > vect_vector; vector<int*> bufs; vect_vector.assign(3, vector<int>(10)); bufs.push_back(&vect_vector[0].front()); bufs.push_back(&vect_vector[1].front()); bufs.push_back(&vect_vector[2].front()); int nb_insert = 5; //Initialize to 2 to generate a back insertion: int pos = 2; while (nb_insert--) { vector<vector<int> > vect_vect(2, vector<int>(10)); vect_vector.insert(vect_vector.begin() + pos, vect_vect.begin(), vect_vect.end()); bufs.insert(bufs.begin() + pos, &vect_vector[pos].front()); bufs.insert(bufs.begin() + pos + 1, &vect_vector[pos + 1].front()); ++pos; } CPPUNIT_ASSERT( vect_vector.size() == 13 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) for (int i = 0; i < 5; ++i) { CPPUNIT_ASSERT( bufs[i + 1] == &vect_vector[i + 1].front() ); CPPUNIT_ASSERT( bufs[12 - i] == &vect_vector[12 - i].front() ); }#endif } //Check the different erase methods. { vector<vector<int> > vect_vector; vect_vector.assign(20, vector<int>(10)); vector<vector<int> >::iterator vdit(vect_vector.begin()), vditEnd(vect_vector.end()); vector<int*> bufs; for (; vdit != vditEnd; ++vdit) { bufs.push_back(&vdit->front()); } { // This check, repeated after each operation, check the vector consistency: vector<vector<int> >::iterator it = vect_vector.end() - 5; int nb_incr = 0; for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} CPPUNIT_ASSERT( nb_incr == 5 ); } { //erase in front: vect_vector.erase(vect_vector.begin() + 2); bufs.erase(bufs.begin() + 2); CPPUNIT_ASSERT( vect_vector.size() == 19 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { vector<vector<int> >::iterator it = vect_vector.end() - 5; int nb_incr = 0; for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} CPPUNIT_ASSERT( nb_incr == 5 ); } { //erase in the back: vect_vector.erase(vect_vector.end() - 2); bufs.erase(bufs.end() - 2); CPPUNIT_ASSERT( vect_vector.size() == 18 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { vector<vector<int> >::iterator it = vect_vector.end() - 5; int nb_incr = 0; for (; it != vect_vector.end() && nb_incr < 6; ++nb_incr, ++it) {} CPPUNIT_ASSERT( nb_incr == 5 ); } { //range erase in front vect_vector.erase(vect_vector.begin() + 3, vect_vector.begin() + 5); bufs.erase(bufs.begin() + 3, bufs.begin() + 5); CPPUNIT_ASSERT( vect_vector.size() == 16 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { vector<vector<int> >::iterator it = vect_vector.end() - 5; int nb_incr = 0; for (; it != vect_vector.end() && nb_incr <= 6; ++nb_incr, ++it) {} CPPUNIT_ASSERT( nb_incr == 5 ); } { //range erase in back vect_vector.erase(vect_vector.end() - 5, vect_vector.end() - 3); bufs.erase(bufs.end() - 5, bufs.end() - 3); CPPUNIT_ASSERT( vect_vector.size() == 14 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } } //Check the insert value(s) { vector<vector<int> > vect_vector; vect_vector.assign(20, vector<int>(10)); vector<vector<int> >::iterator vdit(vect_vector.begin()), vditEnd(vect_vector.end()); vector<int*> bufs; for (; vdit != vditEnd; ++vdit) { bufs.push_back(&vdit->front()); } { //2 values in front: vect_vector.insert(vect_vector.begin() + 2, 2, vector<int>(10)); bufs.insert(bufs.begin() + 2, &vect_vector[2].front()); bufs.insert(bufs.begin() + 3, &vect_vector[3].front()); CPPUNIT_ASSERT( vect_vector.size() == 22 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { //2 values in back: vect_vector.insert(vect_vector.end() - 2, 2, vector<int>(10)); bufs.insert(bufs.end() - 2, &vect_vector[20].front()); bufs.insert(bufs.end() - 2, &vect_vector[21].front()); CPPUNIT_ASSERT( vect_vector.size() == 24 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { //1 value in front: vector<vector<int> >::iterator ret; ret = vect_vector.insert(vect_vector.begin() + 2, vector<int>(10)); bufs.insert(bufs.begin() + 2, &vect_vector[2].front()); CPPUNIT_ASSERT( vect_vector.size() == 25 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) CPPUNIT_ASSERT( &ret->front() == bufs[2] ); vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } { //1 value in back: vector<vector<int> >::iterator ret; ret = vect_vector.insert(vect_vector.end() - 2, vector<int>(10)); bufs.insert(bufs.end() - 2, &vect_vector[23].front()); CPPUNIT_ASSERT( vect_vector.size() == 26 );#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC) CPPUNIT_ASSERT( &ret->front() == bufs[23] ); vector<vector<int> >::iterator dit(vect_vector.begin()), ditEnd(vect_vector.end()); for (size_t i = 0; dit != ditEnd; ++dit, ++i) { CPPUNIT_ASSERT( bufs[i] == &dit->front() ); }#endif } } //The following tests are checking move contructor implementations: const string long_str("long enough string to force dynamic allocation"); { //vector move contructor: vector<vector<string> > vect(10, vector<string>(10, long_str)); vector<string> strs; size_t index = 0; while (true) { vector<vector<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(it->front()); it->erase(it->begin()); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } } { //deque move contructor: vector<deque<string> > vect(10, deque<string>(10, long_str)); vector<string> strs; size_t index = 0; while (true) { vector<deque<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(it->front()); it->pop_front(); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } } { //list move contructor: vector<list<string> > vect(10, list<string>(10, long_str)); vector<string> strs; size_t index = 0; while (true) { vector<list<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(it->front()); it->pop_front(); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } }#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) { //slist move contructor: vector<slist<string> > vect(10, slist<string>(10, long_str)); vector<string> strs; size_t index = 0; while (true) { vector<slist<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(it->front()); it->pop_front(); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } }#endif { //binary tree move contructor: multiset<string> ref; for (size_t i = 0; i < 10; ++i) { ref.insert(long_str); } vector<multiset<string> > vect(10, ref); vector<string> strs; size_t index = 0; while (true) { vector<multiset<string> >::iterator it(vect.begin()); advance(it, index % vect.size()); strs.push_back(*it->begin()); it->erase(it->begin()); if (it->empty()) { vect.erase(it); if (vect.empty()) break; } index += 3; } CPPUNIT_ASSERT( strs.size() == 10 * 10 ); vector<string>::iterator it(strs.begin()), itEnd(strs.end()); for (; it != itEnd; ++it) { CPPUNIT_ASSERT( *it == long_str ); } }# endif /* __DMC__ */#if defined (STLPORT)# if !defined (__BORLANDC__) && !defined (__DMC__) { //hash container move contructor: unordered_multiset<string> ref; for (size_t i = 0; i < 10; ++i) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -