2014-09-23 11 views
2

我正在嘗試實施並行數據收集和隨後的單任務數據處理。並行任務將數據收集到多個向量中,然後將收集的容器傳遞到單任務處理類中。一旦所有采集者完成數據收集,處理階段就會開始。如何提供一個STL容器到類方法進行惰性評估?

但是,我很困惑如何實現一個處理類成員,將持有收集的數據。我不能讓它們引用矢量,因爲引用應該在處理對象初始化時初始化。我可能無法使它們指向矢量,因爲指針擺弄不被接受。我也不能讓他們成爲另外一組向量,以避免在分配操作過程中不必要的數據複製。

我應該如何設計處理類的內部以繞過這些限制?

回答

0

答案就在你的問題 - 「......收集數據到許多載體,然後通過收集容器......」

你可以讓你的內部數據結構std::vector並通過使用move外部數據和swap他們與內部載體:

class foo 
{ 
    public: 
     void set_vector(std::vector<int>&& vector) 
     { 
      std::swap(internal_vector, vector); 
     } 

     void alternative_set_vector(std::vector<int>& vector) 
     { 
      std::swap(internal_vector, vector); 
     } 

    private: 
     std::vector<int> internal_vector; 
}; 

void use_foo() 
{ 
    foo some_foo; 
    { 
     std::vector<int> outside_vector;//fill outside_vector with your data 
     some_foo.set_vector(std::move(outside_vector)); 
    } 
    { 
     std::vector<int> outside_vector;//fill outside_vector with your data 
     some_foo.alternative_set_vector(outside_vector); 
    } 
} 

alternative_set_vector版本工作正常,但它不是爲載體將被「裝」與呼叫後,一些「隨機」值調用代碼明顯。

+0

'std :: swap'中有assigment操作符,'std :: move'在C++中11 – mbaitoff 2014-09-23 11:26:13

+0

@mbaitoff std :: swap對於向量具有恆定的時間複雜度 - std :: move不行任何任務 - 這只是一個演員。請檢查答案 – Felics 2014-09-23 11:28:15

+0

中的鏈接是的,你對'std :: swap'說得對。但是,這會導致數據的原始矢量變空,對嗎?假設處理不改變數據,是否有辦法讓數據保留在原始向量中,以便在另一個處理類中使用? – mbaitoff 2014-09-23 12:22:27