通过引用返回向量

时间:2018-06-16 09:53:18

标签: c++ c++11

我有以下问题。

typedef std::pair<VertexT,CostT>  LocalEdgeT;
typedef std::vector<LocalEdgeT>   NeighborT;
typedef std::size_t                 VertexT;
typedef double                      CostT;

virtual const NeighborT& getNeighbors( VertexT v) const override   
    {
        std::vector<LocalEdgeT> neighbors;
        //here I'm adding elements, not important for the question
        return neighbors;
    }

我不能让函数在没有引用的情况下返回NeighborT,因为我必须使用从我的大学给我的函数,因为某些原因需要引用。

但是当我在main中使用以下调用返回它时:

std::vector<NeighborT> test = Object.getNeighbors(arg);

它给出了分段错误,可能是因为我正在返回对局部变量的引用。知道如何修复它,它仍然通过引用返回向量,它在main方法中使用我的函数调用吗? 此外,我必须使用c ++ 11标准进行编译。

其他一些信息:

我只是放入“对象”,因为我认为这个问题并不重要。在我的情况下,函数getNeighbors是Graph类的成员,它具有一定数量的顶点和从顶点a到顶点b的所有边的矢量。函数getNeighbors现在应该找到给定的Vertex v所有邻居。对于类中的每个Vertex都有一个自己的向量是(从我的角度来看)不推荐。 我确实有一张地图,在那里我保存了所有的边缘,并带有双倍的“CostT”来实现这一优势。 这是全班。

typedef std::size_t                 VertexT;
typedef std::pair<VertexT,VertexT>  EdgeT;
typedef double                      CostT;
    class DistanceGraph
    {
  public:
    typedef std::pair<VertexT,CostT>  LocalEdgeT;
    typedef std::vector<LocalEdgeT>   NeighborT;

  protected:

    std::size_t vertexCount;

  public:
    DistanceGraph( int num_verts= 0)
      : vertexCount(num_verts) {}

    virtual ~DistanceGraph() {}

    std::size_t numVertices() const { return vertexCount; }


    virtual const NeighborT& getNeighbors( VertexT v) const = 0;


    virtual CostT estimatedCost( VertexT from, VertexT to) const = 0;

    virtual CostT cost( VertexT from, VertexT to) const = 0;
};

class CoordinateGraph : public DistanceGraph {
public:

    std::map<  EdgeT, CostT  > allEdges;
    std::vector < std::pair < double, double > > geometricPosition; 

    void setNumVertices( size_t);

    friend std::istream& operator >> (std::istream& in,CoordinateGraph& g);

    virtual const NeighborT& getNeighbors( VertexT v) const override   
    {
        std::vector<LocalEdgeT> neighbors;
        for(size_t i = 0; i < (*this).numVertices(); i++)
        {
            EdgeT edge = std::make_pair(v,i);
            if((*this).allEdges.find(edge) != (*this).allEdges.end())
            {
                neighbors.push_back( std::make_pair(i,(*this).allEdges.find(edge) -> second));
            }
        }
        return neighbors;
    }

    virtual CostT cost( VertexT from, VertexT to) const override
    {
        EdgeT edge = std::make_pair(from,to);
        if((*this).allEdges.find(edge) != (*this).allEdges.end()) return (*this).allEdges.find(edge) -> second;
        else return 10000000;
    }
};

为了再次阐明这一点,我不能使函数getNeighbors返回NeighborT。 我看到的一个解决方案是使每个Vertex的邻居成为存储在向量中的类成员。 当我调用上述函数时,上面的代码显然有一个局部变量返回的问题。

2 个答案:

答案 0 :(得分:2)

你可以做的是使neighbors线程本地并在每次调用函数时清除它,这样,你得到的静态语义没有昂贵的初始化,假设你不是多个线程当然。

virtual const NeighborT& getNeighbors( VertexT v) const override   
{
    thread_local std::vector<LocalEdgeT> neighbors;
    neighbors.clear();

    // stuff...

    return neighbors;
}

答案 1 :(得分:2)

因为您似乎很难通过引用返回邻居的向量,所以您基本上没有选择并且必须将它存储在您的类中。

只需要一个_widgets(BuildContext context, DocumentSnapshot document) { widgets.clear(); print(" >> ${customer.fullName}"); widgets.add(new Card( child: new Column( children: <Widget>[ new Text( customer.fullName, style: Theme.of(context).textTheme.title, ), new SizedBox( height: 8.0, ), new Container( height: 1.0, width: 100.0, color: Colors.grey, ), new SizedBox( height: 8.0, ), new ListTile( leading: Icon( MyIcons.phone_call_2, color: Colors.black, ), title: new Text(customer.cell), ), new SizedBox( height: 8.0, ), new Align( alignment: Alignment.bottomRight, child: new Padding( padding: const EdgeInsets.all(8.0), child: new InkWell( onTap: () { print("name: ${customer.fullName}"); Navigator.push( context, new MaterialPageRoute( builder: (context) => new EditProfileScreen( customer: customer, ))); }, child: new Icon( Icons.edit, color: Colors.yellow, ), ), ), ) ], ), )); return widgets; } 类成员来存储它们。

在调用std::map<VertexT, NeighborT>时检查现有条目并返回现有条目或创建新条目并将其添加到地图中。