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

📄 mvctor_test.cpp

📁 stl的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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:#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      vector<vector<int> >::iterator ret =#endif      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:#if defined (STLPORT) && !defined (_STLP_NO_MOVE_SEMANTIC)      vector<vector<int> >::iterator ret =#endif      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;    for (;;) {      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:#  if !defined (__DMC__)    vector<deque<string> > vect(10, deque<string>(10, long_str));#  else    deque<string> deq_str = deque<string>(10, long_str);    vector<deque<string> > vect(10, deq_str);#  endif    vector<string> strs;    size_t index = 0;    for (;;) {      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;    for (;;) {      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;    for (;;) {      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 );    }  }#if defined (STLPORT)#  if !defined (__DMC__)  {    //hash container move contructor:    unordered_multiset<string> ref;    for (size_t i = 0; i < 10; ++i) {      ref.insert(long_str);    }    vector<unordered_multiset<string> > vect(10, ref);    vector<string> strs;    size_t index = 0;    while (true) {      vector<unordered_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#endif}#if defined (__BORLANDC__)/* Specific Borland test case to show a really weird compiler behavior. */class Standalone{public:  //Uncomment following to pass the test  //Standalone() {}  ~Standalone() {}  MovableStruct movableStruct;  vector<int> intVector;};void MoveConstructorTest::nb_destructor_calls(){  MovableStruct::reset();  try  {    Standalone standalone;    throw "some exception";    MovableStruct movableStruct;  }  catch (const char*)  {    CPPUNIT_ASSERT( MovableStruct::nb_dft_construct_call == 1 );    CPPUNIT_ASSERT( MovableStruct::nb_destruct_call == 1 );  }}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -