[英]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.