读书人

vector容器的一些有关问题

发布时间: 2014-01-17 15:01:00 作者: rapoo

vector容器的一些问题
部分代码:

typedef std::vector<EventInfo> EInfos;
typedef std::map<int, EInfos> EvenTable;

void EventMgr::addEvent(int eId, CCObject * target,SEL_CallFuncO selector)
{

EvenTable::iterator iter = m_EventList.find(eId);
if (iter == m_EventList.end())
{
m_EventList[eId] = EInfos();//这句是什么意思啊?没见过,容器可以这样使用吗?

m_EventList[eId].reserve(4);//这句也不是特别懂,求详解啊。
}
m_EventList[eId].push_back(EventInfo(target, selector));
}

[解决办法]
http://www.cplusplus.com/reference/vector/vector/operator[]/

第二句话参考EventInfo的reserve 目测就是保留空间的意思
[解决办法]
m_EventList[eId] = EInfos(); //向map里添加/更新数据 在这里是添加
m_EventList[eId].reserve(4); //向map里的value(一个vector)进行操作,vector的reserve是修改预留元素个数,改善效率,让以后的添加少动态增长

[解决办法]
[code=c]m_EventList[eId] = EInfos();//map容器添加或更新元素

m_EventList[eId].reserve(4);

// reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。

// resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。[/code=c]
[解决办法]
引用:
Quote: 引用:

m_EventList[eId] = EInfos(); //向map里添加/更新数据 在这里是添加
m_EventList[eId].reserve(4); //向map里的value(一个vector)进行操作,vector的reserve是修改预留元素个数,改善效率,让以后的添加少动态增长


EInfos()这是什么意思?得到的是什么?

这是基本的C++语法啊,和容器无关,这就是构造一个临时对象,这里构造的是一个临时vector对象。
这种用法很常见哦,比如

std::string rs = "abc" + std::sting("def"); //前一个是用const char *隐式构造一个临时std::string对象,后面那个自然是显式构造一个临时对象。

最后,这里构造临时对象也可能有提高效率的用处。具体LZ可以搜右值引用。
临时对象算是右值,于是

m_EventList[eId]?=?EInfos();

上面这条赋值语句可能是用右值引用的重载成员函数operator =,这里是用operator =的对象应该是个EInfos对象,也就是个vector,一般支持C++11的编译器,他们的stl容器都会支持右值引用版本的赋值操作,这种版本下的赋值操作不再是拷贝,而是转移,效率会大大提高。
[解决办法]
typedef std::vector<EventInfo> EInfos;
m_EventList[eId] = EInfos();
所以
m_EventList[eId] = std::vector<EventInfo>();
一个空的vector
参考http://en.cppreference.com/w/cpp/container/map/operator_at右值引用版

读书人网 >C++

热点推荐