簡體   English   中英

C ++用於刪除Map和指針向量中指針值的通用代碼

[英]C++ Generic code for deleting pointer value in Map and vector of pointers

我有一些通用代碼用於刪除向量中的指針或Map的值。

有沒有更好的方法(不使用shared_ptrs或任何tr1擴展名)?

代碼也正確嗎?

這是我的代碼:

我有一個命名空間

#ifndef CONTAINERDELETE_H
#define CONTAINERDELETE_H

#include <functional>
#include <map>
#include <vector>
#include <algorithm>


namspace ContainerDelete{

  template<class A, class B>
    struct DeleteMap
    {
      bool operator()( pair<A,B> &x) const
      {

        delete x.second;
        return true;
      }
    };

   template<class T>
    struct DeleteVector
    {
      bool operator()(T &x) const
        { 
          delete x;
          return true;
        }
    };
 }
 #endif

然后我會在一些代碼中使用此命名空間來刪除​​地圖或矢量。

測試圖刪除。

#include "ContainerDelete.h"

using namespace std;

// Test function.
void TestMapDeletion()
{
   // Add 10 string to map.
   map<int,B*> testMap;
   for( int Idx = 0; Idx < 10; ++Idx )
   {
     testMap[Idx] = new B();
   }

   // Now delete the map in a single  line.
   for_each( testMap.begin(),
             testMap.end(),
             ContainerDelete::DeleteMap<int,B*>());
}

測試矢量刪除

// Test Function.
void TestVectorDeletion()
{
  // Add 10 string to vector.
  vector<B*> testVector;
  for( int Index = 0; Index < 10; ++Index )
  {
    testVector.push_back( new B());
  }

  // Now delete the vector in a single  line.
  for_each( testVector.begin(),
            testVector.end(),
            ContainerDelete::DeleteVector<B*>());
} 

謝謝,

麥克風

更好的是如果減少通用性:

struct DeleteVector
{
    template<class T>  //use the template here!
    void operator()(T &x) const
    { 
      delete x;
    }
};

如果你這樣做,那么你可以簡單地寫一下:

for_each(testVector.begin(),
         testVector.end(),
         ContainerDelete::DeleteVector());

使用DeleteVector時無需傳遞類型參數,因為它不再是類模板!

同樣,您可以實現DeleteMap函數。

還應該重命名DeleteVectorDeleteT ,並DeleteMapDeletePairSecond ,因為這兩個可以更一般地使用。 例如, DeleteT甚至可以用於std::list ,甚至可以用於數組。

代碼還可以。 我無法想象有任何其他方法可以刪除指針。 您所能做的就是減少顯式類型規范,如上層問題。 我知道一個更丑陋的方法:函數推導出模板參數的類型。 所以你可以用第一個參數 - vector,second - ptr編寫模板函數,然后使用std :: bind of vector參數使這個函數接受一個參數--ptr。 但是仿函數更好,更靈活。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM