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

时间:2015-01-03 19:06:41

标签: c++ ptrdiff-t

我有一个名为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?

2 个答案:

答案 0 :(得分:4)

您的节点不是数组的一部分。它们分别在内存分配器可以为它们找到的任何位置单独分配。你不能减去它们并期望任何特定的价值。事实上,这样做是未定义的行为。为了计算链表中节点之间的距离,您需要按照下一个或上一个指针迭代它。

答案 1 :(得分:3)

请记住,即使您直接进行分配,分配也不必是连续的。

这意味着如果你有例如。

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

不保证beginend会彼此相邻。

您只能对指向相同内存区域的指针使用指针算法,就像数组一样,否则您将有未定义的行为。