graph.h
struct Edge {
int from;
int to;
unsigned int id;
Edge(): from(0), to(0), id(0) {};
};
struct Vertex {
int label;
vector<Edge> edge;
};
class Graph: public vector<Vertex> {
int gid;
unsigned int edge_size;
};
class Trans {
public:
int tid;
vector<Graph> graph;
};
vector<Trans> database;
database
是一个全局变量,然后我在main函数中调用run_algo(database);
。
void run_algo(vector<Trans> &db) {
EdgeList edges;
for(unsigned int tid = 0; tid < db.size(); tid++) {
Trans &t = db[tid];
...
Graph g = t.graph[gid];
我想问db
是database
的别名,db[tid]
是一个交易向量,但如果使用Trans &t = db[tid];
和Trans t = db[tid];
之间的区别怎么办? ,自从使用Trans &t = db[tid];
撰写样本的作者,但我认为它应该使用Trans t = db[tid];
感谢:)
答案 0 :(得分:2)
Trans &t = someVar;
使t
成为对变量的引用。而
Trans t = someVar;
将调用Trans
的复制构造函数并创建一个全新的对象。
有关详细信息,请参阅http://www.cprogramming.com/tutorial/references.html。
答案 1 :(得分:2)
在
Trans &t = db[tid];
t的行为和db [tid]中的项目完全一样,你改变t,改变db [tid]
使用
Trans t = db[tid];
t只是db [tid]中项目的副本,更改t不会在此更改db [tid]。
答案 2 :(得分:1)
Trans t = db[tid];
使用复制构造函数创建一个新对象。所有更改都将应用于此新对象。
Trans& t = db[tid];
是db[tid]
的别名。对t
的任何更改也将适用于db[tid]
。
答案 3 :(得分:1)
当vector :: operator []通过引用返回一个对象,然后使用
Trans &t = db[tid];
会更有效,因为它不会强制存储在矢量中的对象的副本 - 不像:
Trans t = db[tid];
但是,在第一种情况下,对't'的任何更改都将更改存储在向量中的对象。
答案 4 :(得分:0)
Trans &t
和Trans t
之间的区别在于第一个是引用,它基本上是另一个变量的别名,在这种情况下,无论是什么被取出矢量。另一个是Trans t
这是一个新变量,通过使用operator=
复制数据来复制向量中的东西。
使用引用可避免使用Trans t
时生成的副本。
答案 5 :(得分:0)
Trans &t = db[tid];
表示t
是对象db[tid]
的别名。别名是对象的不同名称,但左右值等于db[tid]
的左右值。因此,如果您对t
进行了一些修改,则会对db[tid]
进行相同修改。
while:
Trans t = db[tid];
表示t
是使用对象db[tid]
的副本制作的。因此,如果您修改t
,db[tid]
将不会受到影响。