Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;矢量实现推前误差 当在C++中制作一个基本的向量实现时,在代码< PurthPrdAs/问题(以下)>代码>中,AOLC/是分配器类, CordNo.是数据的指针, siZe 它们是这样说的,是一个检查指针是否为空的函数。(指针类型为值\u类型*)_C++_Stdvector - Fatal编程技术网

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