C++;矢量实现推前误差 当在C++中制作一个基本的向量实现时,在代码< PurthPrdAs/问题(以下)>代码>中,AOLC/是分配器类, CordNo.是数据的指针, siZe 它们是这样说的,是一个检查指针是否为空的函数。(指针类型为值\u类型*)
测试:C++;矢量实现推前误差 当在C++中制作一个基本的向量实现时,在代码< PurthPrdAs/问题(以下)>代码>中,AOLC/是分配器类, CordNo.是数据的指针, siZe 它们是这样说的,是一个检查指针是否为空的函数。(指针类型为值\u类型*),c++,stdvector,C++,Stdvector,测试: (我的代码)有什么问题?在复制值的for循环中(for(迭代器i=begin();i!=end();++i,++pos))从开头开始,将第一个元素移动到第二个,然后将相同的元素从第二个位置移到第三个位置,以此类推 还请注意,在将每个元素复制到下一个插槽之前,请先销毁它,从而导致未定义的行为。在复制值的for循环中(for(迭代器i=begin();i!=end();++i,++pos))从开头开始,将第一个元素移动到第二个,然后将相同的元素从第二个位置移到第三个位置,以此类推 还要注意
(我的代码)有什么问题?在复制值的for循环中(
for(迭代器i=begin();i!=end();++i,++pos)
)从开头开始,将第一个元素移动到第二个,然后将相同的元素从第二个位置移到第三个位置,以此类推
还请注意,在将每个元素复制到下一个插槽之前,请先销毁它,从而导致未定义的行为。在复制值的for循环中(
for(迭代器i=begin();i!=end();++i,++pos)
)从开头开始,将第一个元素移动到第二个,然后将相同的元素从第二个位置移到第三个位置,以此类推
还要注意的是,在将每个元素复制到下一个插槽之前先销毁它,这会导致未定义的行为。首先,您的代码非常混乱,因为您使用了两个 复制循环中的变量。因为
pos
总是索引一个
在迭代器i
后面,在复制之前先对值进行解构
它是一个。如果类型有一个平凡的
析构函数,但通常不起作用。循环
正确地说,当两个目标
源是构造的元素,副本是
否则
但最大的问题是你抄袭错误
方向。为此,您需要从最高点复制到最低点
重叠复制以工作
编辑:
粗略地说:最简单的实现将包含三个
指针:开始
、结束
和顶部
,对应于开始
在数据中,初始化数据的结尾和
可用(已分配)内存。把一切都移回去
一个元素(假设不为空):
(请注意,这是通用的。请将1
更改为您拥有的数量
要向后移动,并开始插入点,则
获得了通用插入。另一方面,它不使用
构造分配器的函数;为此,您必须
实现自己版本的未初始化\u copy
)
另请注意,在添加新元素后,end
会发生更改
已构造,但在向后复制
之前。理由
这背后:想想如果
新元素抛出一个异常。或者如果其中一个
抛出异常。然后你试图破坏这个物体。
如果过早地递增end
,您将尝试销毁
未完全构造的对象;迟到,你就不会迟到
销毁所有已完全构建的对象
如果您想写出副本(出于心理学原因):
重要的是1)构建到新分配的
元素,但在将一个元素移动到
另一个已经构建的元素,2)确保
永远不要将一个值移动到一个本身不存在的元素中
还没动。这第二点意味着,当向下换档时
从较低的地址开始(对应于
元素被删除,因此可以被覆盖),以及
向上移动时,从较高的元素开始(最高的元素)
首先,您的代码非常混乱,因为您使用的是两个
复制循环中的变量。因为pos
总是索引一个
在迭代器i
后面,在复制之前先对值进行解构
它是一个。如果类型有一个平凡的
析构函数,但通常不起作用。循环
正确地说,当两个目标
源是构造的元素,副本是
否则
但最大的问题是你抄袭错误
方向。为此,您需要从最高点复制到最低点
重叠复制以工作
编辑:
粗略地说:最简单的实现将包含三个
指针:开始
、结束
和顶部
,对应于开始
在数据中,初始化数据的结尾和
可用(已分配)内存。把一切都移回去
一个元素(假设不为空):
(请注意,这是通用的。请将1
更改为您拥有的数量
要向后移动,并开始插入点,则
获得了通用插入。另一方面,它不使用
构造分配器的函数;为此,您必须
实现自己版本的未初始化\u copy
)
另请注意,在添加新元素后,end
会发生更改
已构造,但在向后复制
之前。理由
这背后:想想如果
新元素抛出一个异常。或者如果其中一个
抛出异常。然后你试图破坏这个物体。
如果过早地递增end
,您将尝试销毁
未完全构造的对象;迟到,你就不会迟到
销毁所有已完全构建的对象
如果您想写出副本(出于心理学原因):
重要的是1)构建到新分配的
元素,但在将一个元素移动到
另一个已经构建的元素,2)确保
永远不要将一个值移动到一个本身不存在的元素中
还没动。这第二点意味着w
vector<int> v;
for (int i = 1; i <= 25; ++i)
{
v.push_front(i);
}
for (auto &a : v)
{
std::cout << a << "\n";
}
_Myt &push_front(const value_type &_Value)
{
if (++size_ >= capacity_)
{
reserve(capacity_ * 2);
}
int pos = 1;
if (!empty())
{
pointer tmp = content_; // for the values
for (iterator i = begin(); i != end(); ++i, ++pos)
{
_Alloc().destroy(i); // destroy the current
_Alloc().construct(&content_[pos], buf[pos - 1]); // add the value in into the next position
}
}
_Alloc().construct(&content_[0], _Value); // put _Value to the front
return *this;
}
std::uninitialized_copy( end - 1, end, end );
++ end;
std::copy_backward( begin, end - 2, end - 1 );
_Alloc().construct( end, *(end - 1) );
++ end;
for ( auto current = end - 2; current != begin; -- current ) {
*(current + 1) = (current);
}