其他分享
首页 > 其他分享> > c:替代Vector引用以避免复制大数据

c:替代Vector引用以避免复制大数据

作者:互联网

我花了一些时间寻找答案,但没有找到任何令人满意的东西.

只是对一些经验丰富的C人如何解决这类问题感兴趣,因为现在我正在做一些与生产相关的编码而不是原型.

假设你有一个类已经说出了一个包含大量数据的unordered_map(hashmap),比如500Mb.您希望编写一个访问器,以有效的方式返回该数据的某些子集.

请使用以下内容,其中BigData是存储适量数据的类.

Class A
{
   private:
      unordered_map<string, BigData> m_map;   // lots of data

   public:

    vector<BigData>   get10BestItems()
    {
        vector<BigData>  results;
        for ( ........  // iterate over m_map and add 10 best items to results
        // ... 
       return results;
    }

};

访问器get10BestItems在此代码中效率不高,因为它首先将项目复制到结果向量,然后在返回函数时复制结果向量(从函数堆栈复制).

由于各种原因,你不能在c__中有一个引用向量,这将是明显的答案:

vector<BigData&> results;     // vector can't contain references.

您可以在堆上创建结果向量并将引用传递给它:

vector<BigData>&   get10BestItems()    // returns a reference to the vector
    {
        vector<BigData>  results = new vector<BigData>;   // generate on heap
        for ( ........  // iterate over m_map and add 10 best items to results
            // ... 
       return results;   // can return the reference 
    } 

但是如果你不小心,那么你将遇到内存泄漏问题.它也很慢(堆内存),仍然将数据从地图复制到矢量.

所以我们可以回顾一下c风格的编码,只需使用指针:

vector<BigData*>   get10BestItems()    // returns a vector of pointers
    {
        vector<BigData*>  results ; // vectors of pointers
        for ( ........  // iterate over m_map and add 10 best items to results
        // ... 
       return results;  
    } 

但大多数消息来源表示,除非绝对必要,否则不要使用指针有使用smart_pointers和boost ptr_vector的选项,但我宁愿尽可能避免这些.

我不认为地图会是静态的,所以我不太担心坏指针.只有一个问题,如果代码必须是差异来处理指针.风格上这不愉快:

const BigData&   getTheBestItem()    // returns a const reference
{
       string bestID;
       for ( ........  // iterate over m_map, find bestID
       // ... 
       return m_map[bestID] ; // return a referencr to the best item
}


vector<BigData*>   get10BestItems()    // returns a vector of pointers
{    
        vector<BigData*>  results ; // vectors of pointers
        for_each ........  // iterate over m_map and add 10 best items to results
        // ... 
       return results;  
 };

例如,如果您想要单个项目,则很容易返回参考.

最后的选择是简单地将Hash-map公开并返回一个键向量(在本例中为字符串):

Class A
{
      public:

         unordered_map<string, BigData> m_map;   // lots of data



    vector<string>   get10BestItemKeys()
    {
        vector<string>  results;
        for (........  // iterate over m_map and add 10 best KEYS to results
        // ... 
       return results;
    }

};



A aTest;
... // load data to map

vector <string> best10 =  aTest.get10BestItemKeys();
for ( .... // iterate over all KEYs in best10
{
    aTest.m_map.find(KEY);  // do something with item.
    // ...
} 

什么是最好的解决方案?速度很重要,但我希望易于开发和安全的编程实践.

解决方法:

如果地图是常数,我会使用指针向量.如果要避免更改数据,可以始终返回const指针.

参考文献非常适合它们的工作,但我们仍然有指针(对我而言,这将属于“必要”类别).

标签:accessor,c,pointers,vector,reference
来源: https://codeday.me/bug/20190825/1723840.html