2013-03-11 161 views
2

我使用一個共享指針向量來包含一些名爲customer的遊戲角色。刪除一個向量的指針

typedef std::shared_ptr<Customer> customer; 
std::vector<customer> customers; 

customers.push_back(customer(new Customer())); 

for(int i = 0; i < customers.size(); i++) 
{ 
    if(customers[i]->hasLeftScreen()) 
    { 
     if(!customers[i]->itemRecieved()) 
      outOfStocks++; 
     // Kill Character Here 
    }  
} 

我已經使用過矢量來保存對象,所以我習慣於在矢量上調用擦除和傳入迭代器。我的問題是有沒有在上面的代碼片段中刪除矢量指針的方法?我希望不要在這裏使用迭代器來簡化代碼。我還需要刪除指針,因爲我是客戶一旦離開屏幕就被從遊戲中刪除。

非常感謝

+1

道歉,我已更新原始帖子以顯示此內容。謝謝 – Chris 2013-03-11 16:55:10

+2

這只是乞求錯別字。我可能會建議'typedef std :: shared_ptr CustomerPtr;'或類似的? – BoBTFish 2013-03-11 17:01:21

+0

非常正確@BoBTFish。它確實更有意義。已經更新了我的程序以反映這一點。謝謝 – Chris 2013-03-11 17:04:54

回答

3

考慮使用迭代器,坦率地說會更容易對付。我不確定你對他們的厭惡,但看到如下:

std::vector<customer>::iterator it = customers.begin(); 
while (it != customers.end()) 
{ 
    if(it->hasLeftScreen()) 
    { 
     if(!it->itemRecieved()) 
      outOfStocks++; 
     it = customers.erase(it); 
     continue; 
    } 
    ++it; 
} 

這將從矢量中刪除共享指針實例。如果實例是對共享指針的引用,它也將釋放所述客戶的相關內存,釋放它的析構函數等等(有些時候首先使用智能共享指針,以及使用道具順便說一句,智能指針)。

+0

謝謝你。我真的不喜歡使用迭代器。我只是因爲在那個時候,for循環更快打字。我讓自己感到困惑,因爲這是第一次使用共享指針,我仍然試圖習慣它們的工作方式,而不是僅僅使用一個普通的舊矢量存儲對象。謝謝您的幫助。 – Chris 2013-03-11 17:04:15

+0

@Chris沒問題。花一些時間用迭代器,研究不同的類型(一個好的擴展可以在這裏找到)(http://en.cppreference.com/w/cpp/iterator))。隨着您越來越多地使用標準容器和算法工作,與他們一起流利地付出巨大代價。 – WhozCraig 2013-03-11 17:09:33

+0

輝煌,感謝您的鏈接。總是希望擴展我的C++知識! – Chris 2013-03-11 17:13:07

2

你應該總是使用迭代器;這是一個C++習慣用法。這將改變代碼...

for(auto i = customers.begin(); i != customers.end(); ++i) 
{ 
    if((*i)->hasLeftScreen()) 
    { 
     if(!(*i)->itemRecieved()) 
      outOfStocks++; 
     // Kill Character Here 
    }  
} 

現在,很明顯,我們使用erase-remove idiom來代替。

int outOfStocks = 0; 
auto it = std::remove_if(customer.begin(), customers.end(), [&](Customer const& i) { 
    if(i->hasLeftScreen()) { 
     if(!i->itemRecieved()) { 
      outOfStocks++; 
     } 
     return true; 
    } 
    return false; 
} 
std::erase(it, customers.end()); 
0

您也可以利用「迭代算法」的:

 // Kill Character Here 
     customers.erase(customers.begin() + i); 

...但有一個問題,即customers.size()和當前索引就會無效的容器會收縮。

此外,您不需要明確delete您要刪除的客戶,因爲智能指針會處理該問題。