向Vector添加包含循环缓冲区的类的方法。
以下是一个示例代码,其中CircularBuffer类包含一个循环缓冲区,Vector类将它作为一个成员变量:
#include
template
class CircularBuffer {
int capacity_;
int front_;
int rear_;
std::vector buffer_;
public:
CircularBuffer(int capacity)
: capacity_(capacity), front_(0), rear_(0), buffer_(capacity_) {}
void push_back(T val) {
buffer_[rear_] = val;
rear_ = (rear_+1) % capacity_;
if (rear_ == front_) {
front_ = (front_+1) % capacity_;
}
}
T& operator[](int i) {
return buffer_[(front_+i) % capacity_];
}
const T& operator[](int i) const {
return buffer_[(front_+i) % capacity_];
}
};
template
class Vector {
std::vector> data_;
public:
void push_back(const T& val) {
if (data_.empty() || data_.back().size() == data_.back().capacity()) {
data_.push_back(CircularBuffer(10));
}
data_.back().push_back(val);
}
T& operator[](int i) {
int j = 0;
while (i >= data_[j].size()) {
i -= data_[j].size();
++j;
}
return data_[j][i];
}
const T& operator[](int i) const {
int j = 0;
while (i >= data_[j].size()) {
i -= data_[j].size();
++j;
}
return data_[j][i];
}
int size() const {
int sz = 0;
for (int i = 0; i < data_.size(); ++i) {
sz += data_[i].size();
}
return sz;
}
};
使用方法如下:
Vector v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
for (int i = 0; i < v.size(); ++i) {
std::cout << v[i] << " ";
}
// Output: 1 2 3