使用boost :: circular_buffer <t>作为STL容器

时间:2015-05-26 13:53:25

标签: c++ c++11 boost stl

我使用std::vector<T>std::vector<T>::iterator编写了大量代码。现在我决定用boost中的循环缓冲区替换向量容器,即boost::circular_buffer<T>

当然,现在编译器会抱怨使用std::...的每个函数,我传递boost::...对应的函数。我现在必须重写所有功能吗?我问,因为来自boost的容器完全相同。此外,Boost documentation声明如下:

  

circular_buffer是符合STL的容器。它是一种类似于std :: list或std :: deque的序列。

&#34; STL符合什么&#34;部分意思?它指的是我想要做什么(可互换性)还是仅仅是程序员的心理记录,容器的工作方式与STL相同?

编辑:举个例子

class Item{ };

class Queue{
private:
    std::vector<Item*> item_vector; // Want to replace only this... 
    std::vector<Item*>::iterator current_position;  // ...and this

public:
    Item* get_current_item() const {
        return *current_position;
    } 

    std::vector<Item*> get_item_vector(){
        return item_vector;
    }
};

1 个答案:

答案 0 :(得分:1)

  

我现在必须重写所有功能吗?

如果你的函数专门使用vector及其迭代器类型,那么是的,你必须将它们改为使用不同的类型。

如果它们是模板,旨在与任何足够兼容的容器和迭代器类型一起使用,那么它们应该无需更改即可工作。

  

“STL兼容”部分是什么意思?

它通常意味着它跟随specification的C ++标准库定义的可迭代序列(受古代STL库的影响,其名称有些人松散地用来指代部分或全部现代标准库)。

例如,它有begin()end()成员函数返回迭代器类型;并且迭代器类型可以使用++递增,并使用*取消引用。

这意味着实现为模板的算法,例如:

template <typename InputIterator, typename T>
InputIterator find(InputIterator begin, InputIterator end, T const & value) {
    for (InputIterator it = begin; it != end; ++it) {
        if (*it == value) {
            return it;
        }
    }
    return end;
}

将适用于支持这些操作的任何迭代器类型。虽然是非泛型函数

void find(some_iterator begin, some_iterator end, some_type t);

仅适用于单个特定迭代器类型,并且必须进行更改或复制以支持其他类型。