- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在用 C++ 实现基本 vector 时,我在 push_front
问题(下)中遇到问题 _Alloc
是分配器类,content_
是指向数据的指针,size_
和capacity_
是他们所说的,而 empty()
是检查指针是否为空的函数或不。 (指针
类型为value_type *
)
测试:
vector<int> v;
for (int i = 1; i <= 25; ++i)
{
v.push_front(i);
}
for (auto &a : v)
{
std::cout << a << "\n";
}
输出:
25
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
24
_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;
}
问题是什么(我的代码)?
最佳答案
首先,您的代码非常困惑,因为您使用了两个复制循环中的变量。因为 pos
总是索引一个在迭代器 i
后面,你在复制之前破坏了值它了一个。如果类型有一个微不足道的,哪个会起作用析构函数,但一般不会工作。做循环正确地,当两个目标都必须使用赋值源是构造元素,拷贝否则构造函数。
但最大的问题是你抄错了方向。为此,您需要从最高到最低复制重叠复制工作。
编辑:
粗略地说:最简单的实现将包含三个指针:begin
、end
和top
,对应start数据,初始化数据的末尾和顶部可用(已分配)内存。把一切都移回去一个元素(假设不为空):
std::uninitialized_copy( end - 1, end, end );
++ end;
std::copy_backward( begin, end - 2, end - 1 );
(请注意,这是通用的。将 1
更改为您拥有的任意数量向后移动,然后 begin
到插入点,您就得到了通用插件。另一方面,它不使用construct
分配器函数;为此,你必须实现您自己的 uninitialized_copy
版本。)
另请注意,end
在新元素之后发生了变化构建,但在 copy_backward
之前。对于推理这背后:想想如果 build 新元素抛出异常。或者,如果其中一个分配抛出异常。然后您尝试破坏该对象。如果您过早地增加 end
,您将尝试破坏一个未完全构建的对象;迟到了,你不会销毁所有已完全构建的对象。
如果您想写出拷贝(出于教学原因):
_Alloc().construct( end, *(end - 1) );
++ end;
for ( auto current = end - 2; current != begin; -- current ) {
*(current + 1) = (current);
}
重要的是1)构造到新分配的元素,但在将一个元素移动到时分配 (copy
)另一个已经构建的元素,以及 2) 确保你永远不要将一个值移动到一个本身还没有的元素中感动了。这第二点意味着当向下移动时,你从较低的地址开始(这将对应于元素被删除,因此可以被覆盖),以及何时向上移动,你从更高的元素开始(最高的它将被移动到新的内存中,从而复制构造)。
关于C++ vector 实现 push_front 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22048605/
我有一个充满特定数字的链表,称为 intList。什么会 intList.push_front(2 * intList.back()); 对我的 list 做什么? 最佳答案 它会在列表的前面加上列表
如何将单向链表的push_front()方法实现为它的成员函数?下面的代码无法编译(错误:左值需要作为赋值的左操作数),因为您不能为this 指针赋值。有什么办法解决这个问题? #include us
我正在尝试对 C++ 双端队列实现推送前端方法。我这样做的方式是移动数组的每个元素。它有效,但我的程序最后崩溃了!在我的推送前端方法中,我似乎“运行超过我的数组末尾”,导致堆损坏错误、调试断言,那些事
我有一个 std::deque> rooms我正在迭代: for(auto row : rooms) { row.push_front(new Room()); } 但出于某种原因,它只是用
这个问题在这里已经有了答案: Iterator invalidation rules for C++ containers (6 个答案) 关闭 7 年前。 std::forward_list fo
我无法让我的 push_front 正常工作。 new_head->next = head 似乎无法正确链接 new_head 和 head。我的节点类是通常的节点类,其中 next 是节点指针。我的
我正在使用 SDL 开发 GUI。我创建了一个从属/主类,其中包含指向它自己的从属的指针的 std::list 以在 GUI 中创建层次结构(包含按钮的窗口。按钮标签等)。它工作了好一阵子,直到我编辑
在用 C++ 实现基本 vector 时,我在 push_front 问题(下)中遇到问题 _Alloc 是分配器类,content_ 是指向数据的指针,size_ 和capacity_ 是他们所说的
我正在尝试在我创建的类列表上使用 push_front() 函数。我把它放在一个 for 循环中,但是每当循环将新成员插入列表时,它就会立即自动销毁,我假设是因为它超出了范围。我的问题是如何永久添加这
我已经尝试环顾四周并尝试了所有解决方案,但我似乎无法解决我的问题。我知道我在 push_front 线上遇到了段错误,但我只是迷路了。这是代码- #include #include #includ
刚才,我正在阅读 Josuttis 的 STL 书。 据我所知——c++ vector 是一个可以重新分配的 c 数组。所以,我明白了,为什么在 push_back() 之后所有的迭代器和引用都会变得
我正在阅读这里: http://www.cplusplus.com/reference/deque/deque/push_back/ 对于 void push_back (const value_ty
我正在编写一个 2-way Intlist,其中每个节点都有对其上一个和下一个节点的引用。一切似乎都很好,但是当我使用 Push_front() 方法在开头添加节点时,它们没有上一个引用。 list.
我正在编写一个名为 Playlist 的类,它对 PlaylistNodes 执行不同的操作。我在网上看了看并尝试实现push_back和push_front方法,但我没有成功。 PlaylistNo
我有一个类,我想使用标准库列表来存储它们的列表。我基本上想要 push_front() 列表。所以我的代码是这样的: #include /* ... lots of stuff ...*/ comp
Java 中有没有实现push_back() 和push_front() 方法的集合类? 最佳答案 类(class)java.util.LinkedList有 addFirst/Last()、getF
这个问题在这里已经有了答案: Why no push/pop in front of vector? (4 个答案) 关闭 4 年前。 既然std::vector::push_back()存在,为什
我正在使用 Boost.MPL,我有一个编译时列表 ( boost::mpl::list )。当我推回一个元素时,我得到的东西可能等同于一个列表,但不是 boost::mpl::list。 . #in
如标题所示。 我对双端队列的理解是它分配了“ block ”。我看不出分配更多空间如何使迭代器无效,如果有的话,人们会认为双端队列的迭代器比 vector 的保证更多,而不是更少。 最佳答案 C++
此代码编译失败: 类声明: class threadController { private: static std::forward_list threadList; stati
我是一名优秀的程序员,十分优秀!