簡體   English   中英

在用戶定義的類型上使用std :: ptrdiff_t

[英]Using std::ptrdiff_t on user defined types

我有一個名為node的簡單結構,該結構具有一個值+ 2個指向下一個/上一個節點的指針。

template <class T>
struct node {

     node<T> *prev = NULL;
     node<T> *next = NULL;
     T data;        
};

在這里,我們具有將新節點添加到末尾的功能。

void push_back( T val ) {           

    node<T> *n = new node<T>;   // create node to hold val
    n->data = val;              // set node data with val

    if ( node_count == 0 ) {     

        begins = n;             // begins points to first node          
    }
    else{

        ends->next = n;         // set next in ends
        n->prev = ends;         // set previous             
    }

    ends = n;                   // update ends
    node_count++;               // update list size
}                                       

在main中,我們創建100個鏈接的節點,每個節點都有一個唯一的int值。

for (int i = 0; i != 100; i++){  push_back(i); }

以下是指向第一個/最后一個節點的指針:

node<T> *begins; 
node<T> *ends; 

當嘗試應用指針算術時,麻煩開始了:

std::ptrdiff_t node_sum = ends - begins;

不知何故,node_sum == 528,如果我執行x32編譯,則node_sum == 781。

為什么node_sum不是100?

您的節點不屬於數組。 它們是分別分配的,在內存分配器可以找到它們的任何位置。 您不能減去它們並期望任何特定值。 實際上,這樣做是未定義的行為。 為了計算鏈接列表中節點之間的距離,您需要通過跟隨next或prev指針對其進行迭代。

請記住,即使您彼此相鄰進行分配,分配也不必是連續的。

那意味着如果你有例如

begin = new node<T>;
end = new node<T>;

不能保證beginend將彼此相鄰。

您只能對指向同一存儲區(如數組)的指針使用指針算術,否則您將具有未定義的行為。

暫無
暫無

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

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