我使用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;
}
};
答案 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);
仅适用于单个特定迭代器类型,并且必须进行更改或复制以支持其他类型。