首页 > 代码库 > 非常方便的circular_buffer
非常方便的circular_buffer
编程时候经常需要使用定长的容器(fixed size container),比如有时日志只需要保留一周或一个月,或者缓存一天上游发来的数据流。
实现一个简单的旋转容器只需要像下面这样就好:
std::vector<T> vec(size);vec[i % size] = newelem;
但是boost的circular_buffer提供了更好的封装,更多的功能,我们便不需要也不应该重复造轮子了(DRY):
#include <boost/circular_buffer.hpp>
boost::circular_buffer<int> cb(3); // Insert threee elements into the buffer. cb.push_back(1); std::cout << "1 inserted, size:" << cb.size() << endl; std::cout << "latest is " << cb[cb.size() - 1] << endl; cb.push_back(2); std::cout << "2 inserted, size:" << cb.size() << endl; std::cout << "latest is " << cb[cb.size()-1] << endl; cb.push_back(3); std::cout << "3 inserted, size:" << cb.size() << endl; std::cout << "latest is " << cb[cb.size()-1] << endl; int a = cb[0]; // a == 1 int b = cb[1]; // b == 2 int c = cb[2]; // c == 3 std::cout << "1st is" << a << endl; std::cout << "2nd is" << b << endl; // The buffer is full now, so pushing subsequent // elements will overwrite the front-most elements. cb.push_back(4); // Overwrite 1 with 4. std::cout << "4 inserted, size:" << cb.size() << endl; std::cout << "latest is " << cb[cb.size()-1] << endl; cb.push_back(5); // Overwrite 2 with 5. std::cout << "5 inserted, size:" << cb.size() << endl; std::cout << "latest is " << cb[cb.size()-1] << endl; // The buffer now contains 3, 4 and 5. a = cb[0]; // a == 3 b = cb[1]; // b == 4 c = cb[2]; // c == 5 std::cout << "1st is" << a << endl; cb.pop_back(); // 5 is removed. cb.pop_front(); // 3 is removed. std::cout << "head and tail removed, size:" << cb.size() << endl; std::cout << "latest is " << cb[cb.size() - 1] << endl; // Leaving only one element with value = http://www.mamicode.com/4. int d = cb[0]; // d == 4
非常方便的circular_buffer
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。