如何从方法返回std::vector,而不是每次都是副本
How to return a std::vector from a method and not have it be a copy every time?
我很确定这是一些指针业务,但我已经离开c++一段时间了。
基本上,我有一个具有方法getVector()
的类,该方法返回它存储为类变量的std::vector
。
我想访问这些元素,但不是每次调用getVector()
时复制整个向量。正确的做法是什么?存储为类变量的vector本身不是指针。
向vector返回引用
-
如果调用作用域应该能够修改vector:
class MyClass { std::vector<foo> v; public: std::vector<foo>& getVector() { return v; } };
-
如果调用作用域不需要修改vector:
class MyClass { std::vector<foo> v; public: const std::vector<foo>& getVector() const { return v; } };
都是完全"安全"的,因为vector不是函数作用域的局部。
好吧,如果调用代码可以访问向量,为什么向量是私有属性?如果将其作为公共属性,那么就不需要getVector()方法了,是吗?
如果出于某种充分的理由希望vector为私有属性,则不应该提供这种开放访问,而应该提供适当修改私有数据的方法。
在保持vector私有的同时,最接近于提供开放访问的方法是提供对迭代器
的访问。typedef std::vector<foo>::iterator iterator_foo
iterator_foo begin_foo() { return v.begin(); }
iterator_foo end_foo() { return v.end(); }
你可以这样使用
MyClass::iterator_foo ifoo = std::find(
theclass.begin_foo(), theclass.end_foo(), foo_target );
if ( ifoo != theclass.end_foo() ) {
cout << "found it" << endl;
....
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 指向基类的指针的 std::vector 的深层副本
- 如何将char数据附加到std :: vector而不会导致副本
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 创建std :: vector减去一个元素的副本的最快方法
- 为什么返回 std::vector 仍然是在制作副本
- 是否可以同时从 std::vector 或 std::d eque 中删除和获取对象的副本C++
- 使用 lambda 函数擦除 std::vector 中相同值的副本
- 从计数和元素值初始化 std::vector 与副本
- 将std::字符串数据的深层副本存储到std::vector中
- vector插入对象的副本或引用
- 当向vector中添加元素时,如何知道将生成该对象的副本
- 如何从方法返回std::vector,而不是每次都是副本
- 生成指针的vector的完整副本
- std::vector<class *> 无法正确构建副本
- 为什么这些函数使用vector的不同副本?