如何避免不必要的数据复制

How to avoid unnecessary copying of data?

本文关键字:数据 复制 不必要 何避免      更新时间:2023-10-16

我在我的代码中有这个函数,它以几个向量作为参数,从它们中生成一个结构体并将该结构体推入队列。然后使用while循环以以下方式处理队列:

  1. 如果struct满足某个预定义条件(条件1),则返回true
  2. 如果结构体满足某个预定义条件(条件2)为
  3. 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()而不是tq.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]) }
);