引用对象的STL容器
STL containers with reference to objects
我知道STL容器复制对象。比如我有一个
list<SampleClass> l;
每次当我做
SampleClass t(...);
l.push_back(t);
将生成t的副本。如果SampleClass很大,那么它将非常昂贵。
但是如果我声明l为引用的容器,
list<SampleClass&> l;
当我做
l.push_back(t);
它会避免复制对象吗?
如果你知道你在做什么,你可以使用std::reference_wrapper
:
#include <functional>
#include <vector>
int main()
{
std::vector<std::reference_wrapper<int>> iv;
int a = 12;
iv.push_back(a); // or std::ref(a)
// now iv = { 12 };
a = 13;
// now iv = { 13 };
}
当然要注意,如果任何被引用的变量超出了作用域,而你仍然持有对它们的引用,那么这些都会崩溃。
遗憾的是,它不会编译(至少使用stlport)。但是另一种选择,即在容器中存储指向对象的指针,将完全可以编译。
这将给你的代码留下一些额外的语法噪音——你必须添加新的东西才能将它们插入到容器中。
std::list<class_type*> l;
l.push_back(new class_type);
然而,尽管对象现在不会被复制,但当列表被销毁时,它们也不会自动为您清理。智能指针将为您解决这个问题,但代价是更多的语法噪音。由于std::auto_ptr不能被复制,所以不能把它们放在标准容器中,所以必须使用它们的近亲——共享指针。
std::list<boost::shared_ptr<class_type> > l;
l.push_back(boost::shared_ptr<class_type>(new class_type));
标准库容器要求它们的类型是可复制的;因为引用不是,所以一开始就不能将它们存储在容器中。只要注意对象的生存期,就可以存储指针。Boost有一些指针容器来帮助实现这一点,或者使用智能指针。但是请注意,auto_ptr
是不可复制的(正如标准为此目的所定义的那样),因此shared_ptr
和unique_ptr
是您现在最好的选择。两者都是c++ 11中的标准,而前者在c++ 03中通过boost得到支持。
你想要一个指针的容器:
list<SampleClass*> l;
现在您有了智能指针,您可以使用它进行内存管理,并从中获取原始指针以在STL容器中使用。这样,你就把所有权排除在了容器之外。
这里我有一个树的unique_ptr,但使用STL堆栈来存储原始指针
void TreeTraversal(unique_ptr<BinaryTreeNode>& root) {
stack<BinaryTreeNode *> _stack;
BinaryTreeNode *p = root.get();
_stack.push(p);
while(!_stack.empty()) {
p = _stack.top();
_stack.pop();
...
_stack.push(p->left);
_stack.push(p->right);
}
}
int main() {
unique_ptr<BinaryTreeNode> root = unique_ptr<BinaryTreeNode>(new BinaryTreeNode(...));
TreeTraversal(root);
}
相关文章:
- 在STL容器中使用模板类
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 对象 C++ 向量的 STL 容器
- C++ STL:将空容器传递给lower_bound
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在 STL 容器的 STL 容器上调用 clear
- "迭代器"和"const_iterator"不是 STL 容器的必需成员?
- 删除包含包含动态对象的 STL 容器的智能指针
- C++:在子类中扩展静态 STL 容器/映射成员?
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 没有 STL 容器的迭代器
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 接受任何 STL 容器的函数
- C++ STL 容器中优先级搜索的优雅方法
- 我们如何打印出C++ STL 容器的value_type?
- 关联容器(STL)中的等式求值