簡體   English   中英

struct節點的類數組中的lower_bound

[英]lower_bound in class array of struct nodes

我試圖將Node<K,V> (struct)到數組(類)中,並使用lower_bound對其進行排序。 調試代碼時,我意識到它停止工作了:

auto itr = std::lower_bound...

這是我的add功能代碼:

    template<typename K, typename V>
bool MapSet<K,V>::add(Node<K,V> n){
  if(find_key(n.first) != nullptr){
    return false;
  }


  if(last_ == capacity_){
    grow();
  }
    else{
  Node<K,V> res;
  res.first = n.first;
  res.second = n.second;
  Node<K,V>* newarr = new Node<K,V>[capacity_];
  auto itr = std::lower_bound(ary_,ary_+last_,res);
  size_t itrind = std::distance(ary_, find_key((*itr).first));
  size_t newcount = 1;

  for (size_t i = 0; i < itrind; i++) {
    newarr[i] = ary_[i];
    newcount++;
  }
  newarr[newcount] = res;

  for (size_t i = newcount+1; i < capacity_; i++) {
    newarr[i] = ary_[i];
  }


  delete [] ary_;
  ary_ = newarr;
  last_++;
  return true;
}
}

這是find_key函數代碼:

   template<typename K, typename V>
Node<K,V>* MapSet<K,V>::find_key(K key){
  std::cout << "find func" << '\n';
  for(size_t i=0; i < capacity_; i++){
    if((ary_[i]).first == key){
      Node<K,V>* lol = &ary_[i];
      return lol;
    }
    else{
      continue;
    }
  }
  return nullptr;
}

grow()將數組的大小加倍。 Node<K,V>具有first(K)second(V) ,並且MapSet類具有ary_數組,該數組是Node的數組,

last_ (size_t)是數組的最后一個不為空的元素, capacity_ (size_t)是數組的大小。

那么我的lower_bound函數是否有問題,或者錯誤可能在其他地方? 有什么建議嗎? 謝謝!

編輯:我也在以下方面遇到細分錯誤:

Node<K,V>* lol = &ary_[i];

編輯:我修復了指出有關sizeof(ary_)和delete [] ary_的錯誤,但是我仍然遇到分段錯誤。

這是一個主要問題:

ary_ = newarr;
delete [] newarr;

首先你要ary_指向同一個內存newarr指向。 現在,您有兩個指向相同內存的指針。

然后,釋放兩個指針都指向的內存。

如果之后嘗試取消引用ary_ ,則將具有未定義的行為

另一個問題是:

new Node<K,V>[sizeof(ary_)];

由於ary_是一個指針(我假設因為您沒有向我們展示Minimal, Complete sizeof(ary_) Example ),所以sizeof(ary_)會為您提供指針的大小,而不是指針所指向的內容。

您可以通過停止使用指針和您自己的手動內存管理來輕松解決這兩個問題,而可以使用std::vector

對於初學者,使用new運算符

Node<K,V>* newarr = new Node<K,V>[sizeof(ary_)];

是錯的。 表達式sizeof(ary_)等於指針的大小,具體取決於所使用的系統,該大小通常為4或8個字節。

相對於for語句中的條件存在相同的問題

for(size_t i = newcount + 1; i < sizeof(ary_); i++)
                             ^^^^^^^^^^^^^^^^

這些陳述

    ary_ = newarr;
    delete[] newarr;

有邏輯錯誤。

我想你是說

delete [] ary_;
ary_ = newarr;

同樣也不清楚為什么newcount的初始值設置為1而不是0。

    size_t newcount = 1;

    for(size_t i = 0; i < itrind; i++)
    {
        newarr[i] = ary_[i];
        newcount++;
    }
    newarr[newcount] = res;

這個電話

size_t itrind = std::distance(ary_, find_key((*itr).first));

可以調用未定義的行為。

目前還不清楚功能的grow是做什么的。 這使代碼令人困惑。

暫無
暫無

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

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