2012-03-24 59 views
1

我有一個向量Foo *。我放入的內容總是Foo *,沒有多態性。針對指針向量優化對新的調用?

我使用了一個指針向量,因爲我嘗試了一個列表並且一直崩潰。我需要能夠在其他地方使用指針,所以Foo的常規矢量將無法工作。

ex:b.add(& myRegularVec [6]); //當我添加更多這個指針不會有效。

問題是我需要向量的保留能力。現在,我有這樣的功能:

void addRange(int quantity) 
{ 
    for (int i = 0; i < quantity; ++i) 
     { 
      Foo* obj = new Foo(i); 
      m_theVector.push_back(obj); 
      b.add(obj); 
     } 
} 

不幸的是,這要求新的一大堆,並剖析說,這是瓶頸。

我不能使指針無效ex:增長我需要重做new []。

我可以做些什麼來避免這麼多的電話來新的,並使其更快?

感謝

+2

這句話的含義是什麼:'需要能夠在其他地方使用指針,所以Foo的常規矢量將無法工作。 – 2012-03-24 14:24:53

+0

另外,用'i'做'Foo'真的被__initialized__嗎?它使得優化變得困難,使用默認初始化會更容易,然後對每個'foo'執行像'foo.set_value'這樣的操作。 – orlp 2012-03-24 14:27:02

+0

ex:b.add(&myRegularVec [6]); //當我添加更多這個指針不會有效。 – jmasterx 2012-03-24 14:27:24

回答

4

您可以使用deque<Foo>而不是vector<Foo*>,因爲在容器增長時deque不會使指針無效。

+0

這是正確的解決方案。像'vector'一樣好的位置,但是在調整大小的時候沒有移動項目。 – 2012-03-24 14:36:04

0

我有富的向量*。我放入的內容總是Foo *,沒有多態性。

如果沒有多態性,那麼你需要一個向量Foo而不是Foo*。您沒有正確的理由在程序中使用Foo*。所以忘記你正在做什麼,並與std::vector<Foo>重新開始:

std::vector<Foo> m_theVector; 

然後做到這一點:

void addRange(int quantity) 
{ 
    for (int i = 0; i < quantity; ++i) 
    { 
     m_theVector.push_back(Foo(quantity)); 
    } 
} 

如果你害怕再分配無論出於何種原因,那麼使用std::list不重新分配舊的項目。

+0

但我需要將這些foos添加到容器ex:渲染容器。當它重新分配時,矢量將使它們失效。 – jmasterx 2012-03-24 14:29:27

+0

@Milo:那麼問題是什麼? – Nawaz 2012-03-24 14:31:14

+0

我必須預留足夠的空間以滿足任何需求,但是我不知道這是多少,除非我使用內存浪費量。 – jmasterx 2012-03-24 14:32:41