包含引用的对象向量
Posted
技术标签:
【中文标题】包含引用的对象向量【英文标题】:vector of objects containing references 【发布时间】:2014-07-10 19:28:14 【问题描述】:Edge
Vertex& v1;
Vertex& v2;
float cost;
public :
Edge(Vertex& v_1, Vertex& v_2) :
v1(v_1), v2(v_2)
// other getter and setter functions
;
如何创建矢量 allEdges ? 我知道我必须创建一个向量支持的默认构造函数和赋值运算符,但我已经看到这会因为不存在默认构造函数而产生问题。
我创建了一个默认构造函数,只是为了让 std::vector 对我大喊大叫,但似乎不是正确的做法。
【问题讨论】:
将引用作为成员变量是非常严格的。 我不想在那里使用元素,因为那会复制顶点。尽管顶点保持不变(未添加/删除),但我不能说在实施 5 年后同样如此。 你可以使用指向Vertex
的指针。
使用 c++11 emplace_back 允许您拥有一个没有默认构造函数的对象向量。至于参考,它们将使您的矢量不可复制。一种解决方法是使用 std::reference_wrapper、指针或 boost 可选
【参考方案1】:
使用引用作为成员变量是非常严格的,因为它们必须在构造函数的初始化列表中进行初始化。
但是,拥有一个对象向量,而这些对象又将引用作为成员变量是完全允许的,如下例所示:
#include <vector>
#include <iostream>
struct Vertex
std::size_t id;
Vertex(std::size_t const _id) : id(_id)
;
class Edge
Vertex& v1;
Vertex& v2;
double cost;
public :
Edge(Vertex& v_1, Vertex& v_2, double const _c) : v1(v_1), v2(v_2), cost(_c)
Vertex& getv1() const return v1;
Vertex& getv2() const return v2;
;
int main()
Vertex v1(1), v2(2);
std::vector<Edge> alledges;
alledges.push_back(Edge(v1, v2, 1.0));
for(auto i : alledges) std::cout << i.getv1().id << "->" << i.getv2().id << std::endl;
return 0;
LIVE DEMO
【讨论】:
总结!谢谢!以上是关于包含引用的对象向量的主要内容,如果未能解决你的问题,请参考以下文章
C ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?