【问题标题】:Use boost::circular_buffer<T> as STL container使用 boost::circular_buffer<T> 作为 STL 容器
【发布时间】:2015-08-08 05:56:36
【问题描述】:

我使用std::vector&lt;T&gt;std::vector&lt;T&gt;::iterator 编写了很多代码。现在我决定用 boost 中的循环缓冲区替换向量容器,即boost::circular_buffer&lt;T&gt;

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

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

“STL 兼容”部分是什么意思?它是指我想做的事情(可互换性)还是只是程序员的心理提示,容器在 boost 中的工作方式与在 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;
    }
};

【问题讨论】:

  • 当你说“现在编译器会抱怨”时,你在使用什么样的函数?
  • stl compliant container的可能重复

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


【解决方案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);

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

【讨论】:

  • 非常感谢您,尤其是您的示例。然后我必须重写所有内容,因为我使用了非泛型表达式,但从那时起我不应该再次重写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2015-05-29
  • 1970-01-01
相关资源
最近更新 更多