前兩天有人問我說在3.0 beta2版本裡,使用array 後編譯出錯,其實是因為自beta版本開始,已沒有array,取而代之的是容器:vector 和 map
先說vector吧。
如果說c++的vector容器怎麼用,如果我說太多肯定一下子就暴露了我菜鳥的身份。是以呢,在這裡不過多闡述,也請大神繞路。
是以,還是回到vector的使用問題上吧。該怎麼用?既然vector是替代了array,那就拿array 和vector進行對比吧。
下面我就以建立 sprite 精靈對象的容器為例介紹吧
1、建立
先建立兩個精靈:
auto sp1 = sprite::create("closenormal.png");
sp1->setposition(point(100,100));
this->addchild(sp1,1);
auto sp2 = sprite::create("closeselected.png");
sp2->setposition(point(100,200));
this->addchild(sp2,1);
建立容器
alpha:
auto sp_array = array::create();
beta:
vector<sprite*> sp_vec;
2、将建立好的精靈添加進容器中
alpha:
sp_array->addobject(sp1);
sp_array->addobject(sp2);
sp_vec.pushback(sp1);//和 堆棧 一樣一樣的
sp_vec.pushback(sp2);
3、獲得容器中的大小
int count = sp_array->count();
int count = sp_vec.size();
4、獲得容器中的精靈,并讓這些元素都做統一的動作
for(int i=0;i<sp_array->count();i++)
{
auto sp = (sprite*)sp_array->getobjectatindex(i);
sp->runaction(moveto::create(0.2f,point(100,100)));
}
for( auto& e : sp_vec)
{
e->runaction(moveto::create(0.2f,point(100,100)));//這種for寫法是c++
11的新特性
}
5、删除容器中的精靈
//如果是要删除容器中最後一個精靈的話:
sp_array->removelastobject();
sp_vec.popback();
//如果是直接删除對象:
sp_array->removeobject(sp1);
sp_vec.eraseobject(sp1);
//如果是要删除容器中全部的對象:
sp_array->removeallobject();
sp_vec.clear();
6、其他
”說破不值錢“,其實vector也就那樣啦,恩,那樣...最後補充一些其他的用法:
//a 在容器中的任何一個位置插入對象:
sp_vec.pushback(sp1);
sp_vec.pushback(sp2);
//目前的情況是,sp1在容器的第一個位置,sp2在容器的第二個位置,這時候我們要将sp3放入第一個位置:
sp_vec.insert(0,sp3);//ok
//b 查找容器中的對象:
//1、假設不知道容器中是否有sp3這個精靈,這時候可以這樣:
sp_vec.contains(sp3);//如果有,傳回true,無傳回false;
//2、已知容器中有sp3這個精靈,想獲得它在容器中的位置:
int pos_int = sp_vec.find(sp3);
//上面的方法可以獲得sp3的位置,但傳回的其實是疊代器的位址,你得到的結果可能是45214等等,如果想獲得正常需要的位置,可以這樣:
int pos_int = sp_vec.find(sp3) - sp_vec.begin();//ok
恩,時間不多,先寫到這吧。昨晚才去了解beta裡的vector,如果有什麼寫錯的地方或者用的不恰當的地方,敬請告知...