我的代码中有此函数,该函数将几个 vector 作为参数,从中构造出一个结构并将其推入队列。然后,使用while循环以以下方式处理队列:

  • 如果找到满足某些预定义条件(条件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()而不是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]) }
    );
    

    10-04 16:00