簡體   English   中英

插入多個元素時,向量大小僅增加一

[英]Vector size increases only by one when insert with multiple elements

我目前正在學習 C++ ,對於我目前的目標,我想將vector A中的值填充到vector X中。 vector X不能大於 20。為了存檔,我有一個 function 來檢查當前向量是否有剩余空間。 如果沒有剩余空間,它將用模板中的新向量替換當前向量(該模板已經包含一些條目,所有向量必須相同):

int ChunkedBufferBuilder::checkNewBuffer() {
  int space_left = chunk_size - super::current.size();
  if (space_left == 0) {
    bufVec.push_back(super::current);
    super::current = tpl;
    space_left = chunk_size - super::current.size() ;
  }

  return space_left;
}

bufVec是另一個向量,包含所有大小為 20 的向量。此 function 始終返回當前向量中剩余的“免費”條目數量。

為了避免必須將輸入向量中的每個值插入到較小的向量中,我嘗試在此處使用insert function:

ChunkedBufferBuilder* ChunkedBufferBuilder::push_back(const std::vector<uint8_t> &vec) {
  auto pos = 0;
  const auto size = vec.size();

  while (pos < size) {
    const int space_left = checkNewBuffer();
    const int to = (space_left > size - pos) ? size : pos + space_left;
    auto fromPtr = vec.at(pos);
    auto toPtr = vec.at(to);

    int size = super::current.size();

    super::current.insert(super::current.end(), fromPtr, toPtr);

    size = super::current.size();

    pos = to;
  }

  return this;
}

請注意,我將第二個size = super::current.size()放在那里以幫助調試。 在下圖中,我設置了兩個斷點。 一個在調用insert的行上,另一個在pos = to assignment 上。

std::vector文檔指出:

通過在指定 position 的元素之前插入新元素來擴展向量,通過插入的元素數量有效地增加容器大小。

因此,我希望尺寸會隨着我添加的元素數量而增加。 但是當我運行調試器時:

我在第一個斷點處得到這些值: 第一個斷點的值

而在第二個斷點size只增加了一個: 第二個斷點的值

然而,在 while 循環的第二遍,它會嘗試插入另外 12 個值( size仍然是 8 所以20 - 8 == 12 ): 第一個斷點的值(第二遍)

然后突然大小跳到22: 第二個斷點的值(第二遍)

這目前正在破壞我的程序,我幾乎不知道為什么我的代碼會以目前的方式運行。

在這個片段中:

auto fromPtr = vec.at(pos);
auto toPtr = vec.at(to);

super::current.insert(super::current.end(), fromPtr, toPtr);

您正在插入toPtrfromPtr副本(即重載 (3))。 根據您的描述,您的意思似乎是使用重載(4):

super::current.insert(super::current.end(), vec + pos, vec + to);

它將元素從vec復制到super::current

暫無
暫無

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

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