gpt4 book ai didi

c++ - 如何避免不必要的数据复制?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:06 25 4
gpt4 key购买 nike

我的代码中有这个函数,它接受一些 a vector 作为参数,从中生成一个结构并将该结构推送到队列中。然后使用 while 循环按以下方式处理队列:

  1. 如果找到满足某些预定义条件(条件 1)的结构,则返回 true
  2. 如果满足某些预定义条件(条件 2)的结构是找到,丢弃该结构并继续。
  3. 否则将当前结构分解为多个结构并将它们中的每一个插入队列。

最后,如果处理了整个队列,则返回 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;
}

我的问题是,是否可以通过使用指针结构或引用结构或使用结构指针队列或任何其他方式来避免这种不必要的复制?

最佳答案

您可以通过引用传递一个q_element:

bool solve(const q_element& t) { ... }

这个“拷贝”:

t = q.front(); //1. Copy struct from queue to t
q.pop_front();

可以通过始终引用 q.front() 而不是 tq.pop_front() 来避免循环。

恐怕第二份拷贝是必要的:

q_element temp={ newFormula, newAssignments, newUnknowns }//2. Copy vectors into struct

最后,对于 C++11,最后一个“拷贝”:

q.push_back(temp);//3. Copy struct into queue

将只是一个“移动”操作。

还有这个:

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]) }
);

关于c++ - 如何避免不必要的数据复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24105833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com