我在我的代码中有这个函数,它需要一些向量作为参数,从它们生成一个结构并将该结构推送到队列中。然后使用while循环,以下列方式处理队列:
true
。最后,如果处理完整个队列,则返回false
。
下面给出的代码工作正常,但我认为这段代码多次进行不必要的复制。
struct q_element {
vector<vector<int> > formula;
vector<int> assignments;
vector<int> unknowns;
};
bool solve(vector<vector<int> > init_formula, vector<int> init_unknowns, vector<int> init_assignments) {
q_element t = {init_formula, init_assignments, init_unknowns, };
deque<q_element> q;
q.push_back(t);
while (!q.empty()) {
t = q.front(); //1. Copy struct from queue to t
q.pop_front();
if(satisfiable(t)){
return true;
}else if(unsatisfiable(t){
continue;
}else{
vector<int> set=generateSet(t.unknowns);
for (int i = 0; i < set.size(); i++) {
vector<int> term = set[i];
vector <vector<int> > newFormula=findNewFormula(t.formula, term);
vector<int> newAssignments=findNewAssignments(t.assignments, term);
vector<int> newUnknowns=findnewUnknowns(t.unknowns, term);
q_element temp={ newFormula, newAssignments, newUnknowns }//2. Copy vectors into struct
q.push_back(temp);//3. Copy struct into queue
}
}
}
return false;
}
我的问题是,通过使用指针结构或引用结构或使用结构指针队列或任何其他方式可以避免这种不必要的复制吗?
答案 0 :(得分:2)
您可以通过引用传递q_element
:
bool solve(const q_element& t) { ... }
这&#34; copy&#34;:
t = q.front(); //1. Copy struct from queue to t
q.pop_front();
在while循环结束时始终引用q.front()
而不是t
和q.pop_front()
可以避免。
我担心第二份副本是必要的:
q_element temp={ newFormula, newAssignments, newUnknowns }//2. Copy vectors into struct
最后,使用C ++ 11,最后一个&#34;复制&#34;:
q.push_back(temp);//3. Copy struct into queue
将只是一个&#34;移动&#34;而不是操作。
还有:
vector<int> term = set[i];
vector <vector<int> > newFormula=findNewFormula(t.formula, term);
vector<int> newAssignments=findNewAssignments(t.assignments, term);
vector<int> newUnknowns=findnewUnknowns(t.unknowns, term);
q_element temp={ newFormula, newAssignments, newUnknowns }//2. Copy vectors into struct
q.push_back(temp);//3. Copy struct into queue
可以简化为:
q.emplace_back(
{ findNewFormula(t.formula, set[i])
, findNewAssignments(t.assignments, set[i])
, findnewUnknowns(t.unknowns, set[i]) }
);