用于时间戳组织的容器
Container for time stamp organization
以下是我的一些代码的摘录。
高压泵:
class message_receiver
{
struct Chunk
{
// inits timestamp and other data memebers
Chunk();
boost::uint64_t m_timeStamp;
bool last;
std::vector<std::string> m_message;
...
};
struct Compare
{
bool operator()(const boost::shared_ptr<Chunk> p_left, const
boost::shared_ptr<Chunk> p_right) const
{
return p_left.m_timeStamp > p_right.m_timeStamp;
}
};
std::vector< boost::shared_ptr<Chunk> > m_chunks;
void setTimeStamp(const boost::shared_ptr<Chunk>& p_ca, bool isNew)
//other stuff
};
cpp
:
void message_receiver::setTimeStamp(const boost::shared_ptr<Chunk>& p_ca, bool isNew)
{
p_ca->m_timeStamp = boost::chrono::duration_cast<boost::chrono::microseconds>(
boost::chrono::high_resolution_clock::now().time_since_epoch()).count();
if (isNew)
{
m_chunks.push_back(p_ca);
std::push_heap(m_chunks.begin(), m_chunks.end(), Compare());
}
else
{
std::make_heap(m_chunks.begin(), m_chunks.end(), Compare());
}
}
最终,时间戳的设置是在循环中完成的。所以这个函数被调用了很多次,这应该使所有的时间戳保持在最小堆顺序
我想把戳保持在最小的堆顺序,这样最老的时间戳就可以在我的向量的前面获得。这是用std::pop_heap完成的(没有显示)。这样做是因为我需要顺序访问。
所以我的第一个问题是在else语句中的std::make堆调用。应该这样做吗?我在文档中搜索了一段时间,我没有看到任何其他方法可以修改堆顺序,除非使用std::pop_heap或push heap,但在一种情况下,我所做的就是更新对象。我想当我这样做的时候,堆顺序可能没有得到维护?更新后是否有更好的方法来恢复堆属性?
其次,我意识到这段代码每次更新时间戳时都会调用min-heapify,这是一个复杂度为O(n)的算法。这对我来说有点慢。我考虑使用斐波那契堆,但经过一些研究后,它似乎只会在减小大小时更有效,最终不会提供很大的性能提升。经过大量的研究,我还没有能够找到一个容器,有效地满足我的需求,所以你知道任何其他容器,可能会更好地工作在这里吗?
我不认为堆是最好的选择。
有几个自组织树,它们具有你似乎想要的属性。
我建议使用这样的树(树),只是重新插入修改的元素。
Q。 经过大量的研究,我还没能找到一个容器,有效地满足我的需求,所以你知道任何其他容器,可能会更好地工作在这里吗?
我会看看Boost侵扰中的各种树容器。
- 。http://www.boost.org/doc/libs/1_59_0/doc/html/intrusive/treap_set_multiset.html intrusive.treap_set_multiset.treap_set_multiset_containers
Boost侵扰在用法上有些特殊,但它看起来很像你在这里想要做的(因为侵扰容器从来没有拥有它们所包含的元素)。
相关文章:
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 在多个时间戳处执行函数
- 以天C++为单位的两个时间戳之间的差异
- 获取 QInputEvent 在 Qt 4.8 中被放入 QEventLoop 队列时的时间戳
- 在 C++ 中为文件名添加时间戳
- 如何从远程 SFTP 服务器获取 HH-MM-SS 时间戳格式的文件列表
- 如何将消息时间戳写入日志文件?
- 将时间戳打印到流的最简单方法
- 读取悖论时间戳字段
- C++程序中多个位置的时间 (0) 时间戳
- 在 c++ 中获取 X 毫秒前的时间戳
- 将 unix 时间戳转换为人类可读的日期
- Microsoft NTLM (v2) 中的时间戳使用
- C++中上周一的时间戳
- C++-需要读取存储在文件(.txt)中的时间戳并正确检索
- 在unix/win32上高效计算用于日志记录的日期/时间戳
- 用于时间戳组织的容器