包含引用的对象向量

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 ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?

C++ - 返回指针或常量引用

引用同一对象的向量

C++:对象、对对象的引用、对带有和不带有函数的向量元素的引用——观察到的性能差异

c++ 引用向量的问题?