我想知道当我运行以下代码时,是否可以获得有关错误的原因:terminating with uncaught exception of type std::out_of_range: coordinates (400,0) outside valid range of [0, 399] X [0, 239]
。
该方法假设在传递给它的索引处拆分DLL。因此split(2)
将使用2个节点保留调用它的列表,而旧列表的其余部分将作为新列表返回。我已经尝试了很多不同的方法来编写它,但它们都不起作用(我们必须使用unique_ptrs进行赋值)。
template <class T>
auto dl_list<T>::split(node* start, unsigned split_point)
-> std::unique_ptr<node>
{
assert(split_point > 0);
if(start == nullptr)
return nullptr;
node* curr = start;
uint64_t i = 0;
while(i < split_point)
{
curr = (curr->next).get();
i++;
}
std::unique_ptr<node> temp{nullptr};
temp = std::move(curr->prev->next);
(temp)->prev = nullptr;
return temp;
}
这是包装方法,如果有帮助:
template <class T>
auto dl_list<T>::split(unsigned split_point) -> dl_list
{
if (split_point >= size_)
return {};
if (split_point == 0)
{
dl_list lst;
swap(*this);
return lst;
}
auto old_size = size_;
auto new_head = split(head_.get(), split_point);
// set up current list
size_ = split_point;
for (tail_ = head_.get(); tail_->next; tail_ = tail_->next.get())
;
// set up returned list
dl_list ret;
ret.head_ = std::move(new_head);
for (ret.tail_ = ret.head_.get(); ret.tail_->next;
ret.tail_ = ret.tail_->next.get())
;
ret.size_ = old_size - split_point;
return ret;
}
答案 0 :(得分:-1)
这是在节点的左(上)侧取消链接指定节点加上列表其余部分的代码,假设始终存在前一个节点(即带有标题节点的列表):
auto unlinked_list_from( Node* p )
-> Node*
{
p->prev->next = nullptr;
p->prev = nullptr;
return p;
}
查找 n '节点是一个单独的问题。
在找到 n '节点并将其与列表的其余部分取消链接时,将两者结合起来是一个更高级别的问题,使用两个较低级别的解决方案。
在链表或树的内部指针中,用户所有权智能指针(如std::unique_ptr
或std::shared_ptr
通常不是一个好主意。在承担破坏责任的意义上,每个节点都拥有前一个和下一个节点的情况并非如此。这是原始指针的一种情况。
但是,除了学习和高级编程之外,使用标准库容器,例如std::vector
。