代码之家  ›  专栏  ›  技术社区  ›  baash05

更改C++矢量的后备内存

  •  5
  • baash05  · 技术社区  · 17 年前

    我有一个有1000个“节点”的向量

     if(count + 1 > m_listItems.capacity())
         m_listItems.reserve(count + 100);
    

    问题是,当我要重新加注时,我也会将其清除。

    m_listItems.clear();
    

    容量不变。

    5 回复  |  直到 15 年前
        1
  •  20
  •   Johannes Schaub - litb    17 年前
    vector<Item>(m_listItems).swap(m_listItems);
    

    会缩水 m_listItems http://www.gotw.ca/gotw/054.htm (赫伯·萨特)

    如果仍要清除它,请使用空向量交换:

    vector<Item>().swap(m_listItems);
    

        2
  •  2
  •   Stack Overflow is garbage    17 年前

    您可以按照其他人的建议以及中的说明交换向量 http://www.gotw.ca/gotw/054.htm 但要知道这是事实 不 free,您正在执行每个元素的复制,因为向量必须分配一个新的、更小的内存块,并复制所有旧内容。(交换操作基本上是免费的,但您使用的是一个临时变量交换,该变量已初始化为原始向量数据的副本,即 不 免费)

    如果您事先知道向量有多大,则应首先分配正确的大小,因此无需调整大小:

    std::vector<foo> v(1000); // Create a vector with capacity for 1000 elements
    

    无论如何

    :

    baash05:如果你有1000000件物品呢 10兆公羊。你会说

    否。调整向量大小需要 内存,暂时,所以如果你的内存有限,这可能会破坏你的应用程序。(必须在内存中保留原始向量, 和

    如果有1000000项,则应将向量初始化为正确的大小

    你有两种可能的情况。要么知道需要存储多少元素,要么不知道。如果你知道,那么你可以首先用正确的大小创建向量,这样你就不需要调整它的大小,或者你不知道,然后你可以保留多余的容量,这样至少在你重新填充向量时它就不需要向上调整大小了。

        3
  •  1
  •   Tim Stewart    17 年前

    您可以从以下位置尝试此技术: here

    std::vector< int > v;
    // ... fill v with stuff...
    std::vector< int >().swap( v );
    
        4
  •  1
  •   Kasprzol    17 年前

    你可以 swap 它使用具有所需容量的新向量。

    vector< int > tmp;
    old.swap( tmp );
    
        5
  •  1
  •   Paul Sonier    17 年前