Cocos2d-x3.1Vector的使用
来源:互联网 发布:手机制谱软件 编辑:程序博客网 时间:2024/05/17 07:21
//.hclass VectorUnitLayout : public Layout{public: CREATE_FUNC(VectorUnitLayout); virtual bool init(); void constFunc(const Vector<Node*> &vec) const; };
//.cppbool VectorUnitLayout::init(){ bool bRet = false; do{ CC_BREAK_IF(!Layout::init()); Vector<Node*> vec; CCASSERT(vec.empty(), ""); CCASSERT(vec.capacity() == 0, "");//容器剩余容量 CCASSERT(vec.size() == 0, ""); CCASSERT(vec.max_size() > 0, ""); auto node1 = Node::create();//引用计数为1 node1->setTag(1); vec.pushBack(node1);//引用计数+1 CCASSERT(node1->getReferenceCount() == 2, "");//得到引用计数 auto node2 = Node::create(); node2->setTag(2); vec.pushBack(node2); CCASSERT(vec.getIndex(node1) == 0, ""); CCASSERT(vec.getIndex(node2) == 1, ""); auto node3 = Node::create(); node3->setTag(3); vec.insert(1, node3); CCASSERT(vec.at(0)->getTag() == 1, ""); CCASSERT(vec.at(1)->getTag() == 3, ""); CCASSERT(vec.at(2)->getTag() == 2, ""); //Test copy constructor Vector<Node*> vec2(vec); CCASSERT(vec2.size() == vec.size(), ""); ssize_t size = vec.size(); for(ssize_t i = 0; i < size; i++) { CCASSERT(vec2.at(i) == vec.at(i), ""); CCASSERT(vec.at(i)->getReferenceCount() == 3, ""); CCASSERT(vec2.at(i)->getReferenceCount() == 3, ""); } //Test copy assignment operator Vector<Node*> vec3; vec3 = vec2; CCASSERT(vec3.size() == vec2.size(), ""); size = vec3.size(); for(ssize_t i = 0; i < size; ++i) { CCASSERT(vec3.at(i) == vec2.at(i), ""); CCASSERT(vec3.at(i)->getReferenceCount() == 4, ""); CCASSERT(vec2.at(i)->getReferenceCount() == 4, ""); CCASSERT(vec.at(i)->getReferenceCount() == 4, ""); } //Test move constructor auto createVector = [this](){ Vector<Node*> ret; for(int i = 0; i < 20; i++) { ret.pushBack(Node::create()); } int j = 1000; for(auto& child : ret) { child->setTag(j++); } return ret; }; Vector<Node*> vec4(createVector()); for(const auto& child : vec4) { CC_UNUSED_PARAM(child); CCASSERT(child->getReferenceCount() == 2, ""); } //Test init Vector<T> with capacity Vector<Node*> vec5(10); CCASSERT(vec5.capacity() == 10, ""); vec.reserve(20);//储备 CCASSERT(vec.capacity() == 20, ""); CCASSERT(vec5.size() == 0, ""); CCASSERT(vec5.empty(), ""); auto toRemovedNode = Node::create(); vec5.pushBack(toRemovedNode); CCASSERT(toRemovedNode->getReferenceCount() == 2, ""); //Test move assignment operator vec5 = createVector(); CCASSERT(toRemovedNode->getReferenceCount() == 1, ""); CCASSERT(vec5.size() == 20, "size should be 20"); for(const auto& child : vec5) { CC_UNUSED_PARAM(child); CCASSERT(child->getReferenceCount() == 2, ""); } //Test Vector<T>::find CCASSERT(vec.find(node3) == (vec.begin() + 1), ""); CCASSERT(std::find(std::begin(vec),std::end(vec),node2) == (vec.begin() + 2), ""); CCASSERT(vec.front()->getTag() == 1, ""); CCASSERT(vec.back()->getTag() == 2, ""); CCASSERT(vec.getRandomObject(), "");//随机获取对象 CCASSERT(!vec.contains(Node::create()), ""); CCASSERT(vec.contains(node1), "");//包含 CCASSERT(vec.contains(node2), "");//包含 CCASSERT(vec.contains(node3), "");//包含 CCASSERT(vec.equals(vec2), ""); CCASSERT(vec.equals(vec3), ""); //Insert vec5.insert(2, node1); CCASSERT(vec5.at(2)->getTag() == 1, ""); CCASSERT(vec5.size() == 21, ""); vec5.back()->setTag(100); vec5.popBack(); CCASSERT(vec5.size() == 20, ""); CCASSERT(vec5.back()->getTag() != 100, ""); //Erase and clear Vector<Node*> vec6 = createVector(); Vector<Node*> vec7 = vec6; CCASSERT(vec6.size() == 20, ""); vec6.erase(vec6.begin()+1); CCASSERT(vec6.size() == 19, ""); CCASSERT((*(vec6.begin() + 1))->getTag() == 1002, ""); vec6.erase(vec6.begin() + 2, vec6.begin() + 10); CCASSERT(vec6.size() == 11, ""); CCASSERT(vec6.at(0)->getTag() == 1000, ""); CCASSERT(vec6.at(1)->getTag() == 1002, ""); CCASSERT(vec6.at(2)->getTag() == 1011, ""); CCASSERT(vec6.at(3)->getTag() == 1012, ""); vec6.erase(3); CCASSERT(vec6.at(3)->getTag() == 1013, ""); vec6.eraseObject(vec6.at(2)); CCASSERT(vec6.at(2)->getTag() == 1013, ""); vec6.clear(); auto objA = Node::create(); auto objB = Node::create(); auto objC = Node::create(); { Vector<Node*> array1; Vector<Node*> array2; array1.pushBack(objA); array1.pushBack(objA); array1.pushBack(objA); array2.pushBack(objA);//retain count is 5 array2.pushBack(objB);//retain count is 2 array2.pushBack(objC);//retain count is 2 for(auto obj : array1) { array2.eraseObject(obj); } CCASSERT(objA->getReferenceCount() == 4, ""); } CCASSERT(objA->getReferenceCount() == 1, ""); { Vector<Node*> array1; array1.pushBack(objA); // retain count is 2 array1.pushBack(objA); // retain count is 3 array1.pushBack(objA); // retain count is 4 CCASSERT(objA->getReferenceCount() == 4, ""); array1.eraseObject(objA, true); // Remove all occurrences in the Vector. CCASSERT(objA->getReferenceCount() == 1, ""); array1.pushBack(objA); // retain count is 2 array1.pushBack(objA); // retain count is 3 array1.pushBack(objA); // retain count is 4 array1.eraseObject(objA, false); CCASSERT(objA->getReferenceCount() == 3, ""); // Only remove the first occurrence in the Vector. } //Check the retain count in vec7 CCASSERT(vec7.size() == 20, ""); for(const auto &child : vec7) { CC_UNUSED_PARAM(child); CCASSERT(child->getReferenceCount() == 2, ""); } //sort Vector<Node*> vecForSort = createVector(); std::sort(vecForSort.begin(), vecForSort.end(),[](Node* a, Node* b){ return a->getTag() >= b->getTag(); }); for(int i = 0; i < 20; i++) { CCASSERT(vecForSort.at(i)->getTag()-1000 == (19-i), ""); } //Reverse vecForSort.reverse(); for(int i =0; i < 20; i++) { CCASSERT(vecForSort.at(i)->getTag() - 1000 == i, ""); } //Swap Vector<Node*> vecForSwap = createVector(); vecForSwap.swap(2, 4); CCASSERT(vecForSwap.at(2)->getTag() == 1004, ""); CCASSERT(vecForSwap.at(4)->getTag() == 1002, ""); vecForSwap.swap(vecForSwap.at(2), vecForSwap.at(4)); CCASSERT(vecForSwap.at(2)->getTag() == 1002, ""); CCASSERT(vecForSwap.at(4)->getTag() == 1004, ""); //shrinkToFit缩小以适应 Vector<Node*> vecForShrink = createVector(); vecForShrink.reserve(100);//储备100个空间 CCASSERT(vecForShrink.capacity() == 100, ""); vecForShrink.pushBack(Node::create()); vecForShrink.shrinkToFit(); CCASSERT(vecForShrink.capacity() == 21, ""); //get random object //set the seed by time srand((unsigned)time(nullptr)); Vector<Node*> vecForRandom = createVector(); log("<------begin------>"); for(int i = 0; i < vecForRandom.size(); i++) { log("Vector: random object tag = %d",vecForRandom.getRandomObject()->getTag()); } log("<-------end-------->"); //self assignment自动赋值 Vector<Node*> vecSelfAssign = createVector(); vecSelfAssign = vecSelfAssign; CCASSERT(vecSelfAssign.size() == 20, ""); for(const auto &child : vecSelfAssign) { CC_UNUSED_PARAM(child); CCASSERT(child->getReferenceCount() == 2, ""); } vecSelfAssign = std::move(vecSelfAssign); CCASSERT(vecSelfAssign.size() == 20, ""); for (const auto& child : vecSelfAssign) { CC_UNUSED_PARAM(child); CCASSERT(child->getReferenceCount() == 2, ""); } //const at Vector<Node*> vecConstAt = createVector(); constFunc(vecConstAt); bRet = true; }while(0); return bRet;}void VectorUnitLayout::constFunc(const Vector<cocos2d::Node *> &vec) const{ log("vec[8] = %d",vec.at(8)->getTag());}
0 0
- Cocos2d-x3.1Vector的使用
- Cocos2d-x3.1中ListView的使用
- Cocos2d-x3.1自定义字体库的使用
- Cocos2d-x3.1ImageView的使用
- Cocos2d-x3.1Map的使用
- Cocos2d-x3.1中DrawNode的使用
- Cocos2d-x3.1中的TableView的使用
- Cocos2d-x3.1FileUtilsTest使用
- Cocos2d-x3.1SpriteBatchNode使用
- Cocos2d-x3.1粒子使用
- cocos2d-x3.0 Vector和Map简单使用
- cocos2d-x3.0 Vector和Map快速使用指引
- cocos2d-x3.0新增的Vector类,cocos2d-x3.0新的数据结构
- Cocos2d-x3.1中的Text控件的使用
- Cocos2d-x3.1中调度器的使用
- Cocos2d-x3.1中ClippingNode的使用实例
- cocos2d-x3.0 关于ScrollView的使用
- Cocos2d-x3.0 画图函数的使用
- App加密那点事&浅探爱加密原理
- uva-11292-Dragon of Loowater
- db2mtrk--db2内存使用查看工具
- 字符串移位包含问题
- IOS应用开发06——上拉下拉刷新(MJRefresh.h)
- Cocos2d-x3.1Vector的使用
- Android第三方开源框架之SlidingMenu详解
- android 混淆文件proguard.cfg详解
- MFC获取exe文件所在的路径
- 精通CSS(1)-图像背景那些事儿
- 强命名的有趣实验
- UVA-1583 - Digit Generator
- WiFi共享精灵:路由器的痛处
- Form中Trigger的执行顺序(转)