各位 C++ 专家,大家好,
我有一个循环缓冲区的类模板
#ifndef CIRCULAR_BUFFER_H
#define CIRCULAR_BUFFER_H
#include <algorithm>
#include <cstddef>
#include <cassert>
#include <stdexcept>
#include <iostream>
template <typename T>
class CircularBuffer
{
public:
typedef size_t size_type;
typedef T& reference;
typedef const T& const_reference;
typedef T* pointer;
typedef const T* const_pointer;
explicit CircularBuffer(size_type capacity);
CircularBuffer(const CircularBuffer<T> &rhs);
CircularBuffer(CircularBuffer<T>&& rhs);
~CircularBuffer() { if (_buffer) delete[] _buffer; }
CircularBuffer<T>& operator=(CircularBuffer<T> rhs);
size_type size() const { return (_full ? _capacity : _front); }
size_type capacity() const { return _capacity; }
bool is_full() const { return _full; }
const_reference operator[](size_type index) const;
reference operator[](size_type index);
void add(T item);
void resize(size_type new_capacity);
friend void swap(CircularBuffer<T> &a, CircularBuffer<T> &b)
{
std::swap(a._buffer, b._buffer);
std::swap(a._capacity, b._capacity);
std::swap(a._front, b._front);
std::swap(a._full, b._full);
}
private:
pointer _buffer;
size_type _capacity;
size_type _front;
bool _full;
CircularBuffer();
};
template<typename T>
CircularBuffer<T>::CircularBuffer()
: _buffer(nullptr)
, _capacity(0)
, _front(0)
, _full(false)
{
}
template<typename T>
CircularBuffer<T>::CircularBuffer(size_type capacity)
: CircularBuffer()
{
if (capacity < 1) throw std::length_error("Invalid capacity");
_buffer = new T[capacity];
_capacity = capacity;
}
template<typename T>
CircularBuffer<T>::CircularBuffer(const CircularBuffer<T> &rhs)
: _buffer(new T[rhs._capacity])
, _capacity(rhs._capacity)
, _front(rhs._front)
, _full(rhs._full)
{
std::copy(rhs._buffer, rhs._buffer + _capacity, _buffer);
}
template<typename T>
CircularBuffer<T>::CircularBuffer(CircularBuffer<T>&& rhs)
: CircularBuffer()
{
swap(*this, rhs);
}
template<typename T>
typename CircularBuffer<T>::const_reference
CircularBuffer<T>::operator[](size_type index) const
{
static const std::out_of_range ex("index out of range");
if (index < 0) throw ex;
if (_full)
{
if (index >= _capacity) throw ex;
return _buffer[(_front + index) % _capacity];
}
else
{
if (index >= _front) throw ex;
return _buffer[index];
}
}
template<typename T>
typename CircularBuffer<T>::reference
CircularBuffer<T>::operator[](size_type index)
{
return const_cast<reference>(static_cast<const CircularBuffer<T>&>(*this)[index]);
}
template<typename T>
CircularBuffer<T>&
CircularBuffer<T>::operator=(CircularBuffer<T> rhs)
{
swap(*this, rhs);
return *this;
}
template<typename T>
void
CircularBuffer<T>::add(T item)
{
_buffer[_front++] = item;
if (_front == _capacity) {
_front = 0;
_full = true;
}
}
template<typename T>
void
CircularBuffer<T>::resize(size_type new_capacity)
{
if (new_capacity < 1) throw std::length_error("Invalid capacity");
if (new_capacity == _capacity) return;
size_type num_items = size();
size_type offset = 0;
if (num_items > new_capacity)
{
offset = num_items - new_capacity;
num_items = new_capacity;
}
pointer new_buffer = new T[new_capacity];
for (size_type item_no = 0; item_no < num_items; ++item_no)
{
new_buffer[item_no] = (*this)[item_no + offset];
}
pointer old_buffer = _buffer;
_buffer = new_buffer;
_capacity = new_capacity;
_front = (num_items % _capacity);
_full = (num_items == _capacity);
delete[] old_buffer;
}
#endif // CIRCULAR_BUFFER_H
通常我这样初始化
timed_temperature aTimedTemperature;
aTimedTemperature.dt =102019;
aTimedTemperature.temp=37.0;
CircularBuffer<timed_temperature> myCircularBufferedTemps = CircularBuffer<timed_temperature> (PLOT_RING_BUFFER_SIZE);
myCircularBufferedFilteredTemps.add(aTimedTemperature.dt);
所以我尝试像这样创建一个 CircularBuffer 向量
std::vector<CircularBuffer<timed_temperature>> *myTempsVector = new std::vector< CircularBuffer<timed_temperature>(PLOT_RING_BUFFER_SIZE) >;
但显然对于你们所有人☺️,它不起作用!
我尝试了很多事情都没有成功。所以我的问题只是如何在我的标题中声明一个成员,它是我的向量CircularBuffer<timed_temperature>(PLOT_RING_BUFFER_SIZE)
以及如何访问向量的一个元素的 myTempsVector[i].is_full() 方法?
感谢您的帮助。
您在CircularBuffer<timed_temperature>
的构造函数和std::vector<T>
构造函数之间感到困惑。
当你写:
std::vector< CircularBuffer<timed_temperature> >(PLOT_RING_BUFFER_SIZE)
它将使用 调用 std::vector 的构造函数PLOT_RING_BUFFER_SIZE
,尝试使用默认构造函数分配PLOT_RING_BUFFER_SIZE
不同CircularBuffer<timed_temperature>
的构造函数。
简单地定义你的向量:
std::vector<CircularBuffer<timed_temperature>> myTempsVector;
然后添加 ( push_back
) 任何你想要的新实例,例如:
myTempsVector.push_back(CircularBuffer<timed_temperature> (PLOT_RING_BUFFER_SIZE));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句