场景,
我有一个有数千条“条目”的跟踪文件(我称它们为“滴答”)。每个“条目”包含几行信息。有两种类型的信息(位置数据和多播数据),因此每一行要么是关于‘位置’或‘多播’。
目标:--我的目标是高效地将它们存储到数据结构中:
Implementation:
为了存储每个条目的信息,我有:
//////////////////
struct multicast_data{
//... integers, vectors of integers, string etc.
}
std::list<multicast_data> multicasts;
///////////////////////
struct AgentLocation{
//... integers, operator overload etc.
};
std::set<AgentLocation> agentsLocation;
////////////////////////接下来,我希望将条目存储在队列中,因此我首先将它们捆绑在另一个结构中,如下所示:
struct tickDataBundle{
const std::list<multicast_data> & multicasts;
const std::set<AgentLocation> & agentsLocation;
tickDataBundle(const std::list<multicast_data> &multicasts,
const std::set<AgentLocation> &agentsLocation):
multicasts(multicasts),
agentsLocation(agentsLocation){}
};然后我把他们排成一队:
MessageQueue<tickDataBundle> m_processed_data;问题:
tickDataBundle中的容器(列表和set)是在某种方法的范围内创建和填充的,当作用域结束时,这些容器自然会被销毁(没有堆)。因此,即使返回对这些容器的引用,也会创建悬空引用。所以我想,如果在范围结束之前,我将这些容器的const-reference添加到tickDataBundle对象中,然后将这个对象推到MessageQueue中,我就会从C++的优化中受益,以避免整个容器被销毁,并减少一些复制开销。这是一个正确而有效的假设吗?tickDataBundle的一个const引用?(MessageQueue<const tickDataBundle&> m_processed_data;生成错误)谢谢
更新:此部分仅供您参考--,我正在复制MessageQueue的结构和如果声明MessageQueue<const tickDataBundle&> m_processed_data;时会遇到的错误
template<class T>
class MessageQueue {
std::queue<T> messageList;
boost::shared_mutex mutex;
public:
MessageQueue();
virtual ~MessageQueue();
bool ReadMessage();
void post(T message);
bool pop(T&);
void clear();
int size();
};错误:
In file included from /usr/include/c++/4.8/deque:64:0,
from /usr/include/c++/4.8/queue:60,
from ./ns3/drop-tail-queue.h:22,
from ./ns3/network-module.h:24,
from ../src/simmobility/examples/simmobility-RR-baseline.cc:2:
/usr/include/c++/4.8/bits/stl_deque.h: In instantiation of ‘class std::_Deque_base<const sim_mob::RoadRunnerBaseLine::tickDataBundle&, std::allocator<const sim_mob::RoadRunnerBaseLine::tickDataBundle&> >’:
/usr/include/c++/4.8/bits/stl_deque.h:730:11: required from ‘class std::deque<const sim_mob::RoadRunnerBaseLine::tickDataBundle&, std::allocator<const sim_mob::RoadRunnerBaseLine::tickDataBundle&> >’
/usr/include/c++/4.8/bits/stl_queue.h:96:46: required from ‘class std::queue<const sim_mob::RoadRunnerBaseLine::tickDataBundle&, std::deque<const sim_mob::RoadRunnerBaseLine::tickDataBundle&, std::allocator<const sim_mob::RoadRunnerBaseLine::tickDataBundle&> > >’
./ns3/smb_message_queue.h:18:16: required from ‘class sim_mob::MessageQueue<const sim_mob::RoadRunnerBaseLine::tickDataBundle&>’
./ns3/smb_roadrunner_baseline.h:87:47: required from here
/usr/include/c++/4.8/bits/stl_deque.h:448:60: error: forming pointer to reference type ‘const sim_mob::RoadRunnerBaseLine::tickDataBundle&’
typedef _Deque_iterator<_Tp, _Tp&, _Tp*> iterator;
^
/usr/include/c++/4.8/bits/stl_deque.h:449:60: error: forming pointer to reference type ‘const sim_mob::RoadRunnerBaseLine::tickDataBundle&’
typedef _Deque_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;
^
/usr/include/c++/4.8/bits/stl_deque.h:488:61: error: forming pointer to reference type ‘const sim_mob::RoadRunnerBaseLine::tickDataBundle&’
typedef typename _Alloc::template rebind<_Tp*>::other _Map_alloc_type;
AND THE ERROR CONTINUES...发布于 2014-03-14 02:45:01
1.我想如果我引用tickDataBundle中的元素,就会减少一些复制开销。这是一个正确而有效的假设吗?
答案是肯定的。所有tickDataBundle对象的副本都只拥有multicasts和agentsLocation的引用,而不是处理真实的数据。
*2.为什么我不能在上面的队列中保存一个tickDataBundle的引用?(MessageQueue m_processed_data;生成错误)*
必须在对象构造时间点分配const引用。您可以使用const指针作为const引用,如下所示:
MessageQueue<const tickDataBundle*> m_processed_data;https://stackoverflow.com/questions/22394923
复制相似问题