在用户定义的类型上使用 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>;
不能保证 begin
和 end
会相邻。
您只能对指向同一内存区域的指针(如数组)使用指针运算,否则您将有未定义的行为。
我有一个名为 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>;
不能保证 begin
和 end
会相邻。
您只能对指向同一内存区域的指针(如数组)使用指针运算,否则您将有未定义的行为。