在用户定义的类型上使用 std::ptrdiff_t

Using std::ptrdiff_t on user defined types

我有一个名为 node 的简单结构,它包含一个值 + 2 个指向 next/previous 节点的指针。

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); }

这里是指向 first/last 节点的指针:

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 会相邻。

您只能对指向同一内存区域的指针(如数组)使用指针运算,否则您将有未定义的行为。