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

时间:2014-06-08 11:49:58

标签: c++ pointers struct

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

  1. 如果找到满足某些预定义条件(条件1)的结构,则返回true
  2. 如果struct满足某些预定义条件(条件2),则为 发现,丢弃结构并继续。
  3. 否则将当前结构分解为多个结构并将它们推入队列中。
  4. 最后,如果处理完整个队列,则返回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;
    }
    

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

1 个答案:

答案 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()而不是tq.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]) }
);