如何避免不必要的数据复制
How to avoid unnecessary copying of data?
我在我的代码中有这个函数,它以几个向量作为参数,从它们中生成一个结构体并将该结构体推入队列。然后使用while循环以以下方式处理队列:
- 如果struct满足某个预定义条件(条件1),则返回
true
。 - 如果结构体满足某个预定义条件(条件2)为
- Else将当前结构分解为几个结构,并将每个结构推入队列。
最后,如果整个队列处理完毕,返回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();
可以通过在while循环结束时始终引用q.front()
而不是t
和q.pop_front()
来避免。
恐怕第二份是必要的:
q_element temp={ newFormula, newAssignments, newUnknowns }//2. Copy vectors into struct
最后,在c++ 11中,最后一个"copy":
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]) }
);
相关文章:
- 矢量如何将数据复制到另一个矢量?
- 将矢量的数据复制到<MyStruct>矢量<MyStruct>的指针
- 将父类的子类的数据复制到具有相同父类的另一个类
- 使用 memcpy 将矢量数据复制到 wstring 的正确方法
- C++:传递指向函数中类的指针会导致数据复制?
- 将数据复制到磁盘上新位置的语法
- pybind11:如何包装以 std::vector<double> 为参数以避免数据复制的 C++ 函数
- 如何将数据复制到字节数组的某些部分
- 使用Sapera拍摄图像并将数据复制到矢量
- 如果strncpy将随机数据复制到缓冲区中会发生什么
- C++ 促进序列化、构造函数和数据复制
- 将一个通道数据复制到OpenCV中的另一个通道
- SSE将数据复制到变量
- doxygen将doxygen注释中的特定数据复制到markdown页面中
- 正在将指针指向的数据复制到另一个指针中
- 使用 CUDA 将大数据复制到 GPU 和从 GPU 复制大数据
- 尝试将.csv数据复制到c++中的结构时出现堆栈溢出错误
- 数据复制与封装
- 如何将 frontBuffer 数据复制到纹理 DirectX 9
- 更快地将数组中的数据复制到目标,同时应用缩放或偏移因子