我有以下问题。
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的邻居成为存储在向量中的类成员。 当我调用上述函数时,上面的代码显然有一个局部变量返回的问题。
答案 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>
时检查现有条目并返回现有条目或创建新条目并将其添加到地图中。