- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
首先,假设 A
是一个类型:
这是 C++03 RAII 类型的常见示例。现在让我引用 C++14 标准(剪掉不相关的部分):
§23.2.1 General container requirements
11 Unless otherwise specified (see ... and 23.3.6.5) all container types defined in this Clause meet the following additional requirements:
- if an exception is thrown by an
insert()
oremplace()
function while inserting a single element, that function has no effects.§23.3.6.5
vector
modifiersiterator insert(const_iterator position, const T& x);
...1 Remarks: Causes reallocation if the new size is greater than the old capacity. If no reallocation happens, all the iterators and references before the insertion point remain valid. If an exception is thrown other than by the copy constructor, move constructor, assignment operator, or move assignment operator of
T
or by anyInputIterator
operation there are no effects. If an exception is thrown while inserting a single element at the end andT
isCopyInsertable
oris_nothrow_move_constructible<T>::value
istrue
, there are no effects. Otherwise, if an exception is thrown by the move constructor of a non-CopyInsertable
T
, the effects are unspecified.2 Complexity: The complexity is linear in the number of elements inserted plus the distance to the end of the vector.
现在考虑一下:
std::vector<A> v(5);
v.reserve(10);
v.insert(begin() + 2, A());
显然我们插入的是单个元素,因此 §23.2.1 - 11 适用并且操作成功或 v
不变。 §23.3.6.5 对此没有任何改变。复制构造函数抛出异常。我们没有在最后插入。不使用移动构造函数。
但现在考虑一下在插入实现过程中可能出现的这种情况假设没有发生重新分配:
01234_____ initial state
0123_4____ making space by copying
012_34____ continued
012?34____ continued, but copy operation threw
此时所有 future 的复制操作都可能抛出,从而无法根据需要恢复状态。哎呀。
如果没有实现强大异常安全性的重新分配,我看不到任何实现。这意味着在插入没有移动构造函数和中间抛出复制构造函数的类型时,任何实现都必须始终重新分配。然而:
insert(pos, value)
由于不断的重新分配,速度变得难以忍受。n
操作)。可以说“如果新容量大于旧容量,则导致重新分配。” 意味着如果新容量不大于旧容量,则不允许重新分配.
为了支持这一点,请考虑一个实现是否可以随时重新分配,用户无法知道。这使得关于保留迭代器的保证(“如果没有发生重新分配,则插入点之前的所有迭代器和引用仍然有效。”)无用的信息,并且让你想知道为什么这两个句子都被插入到标准中首先。
1 和 2 是非常糟糕的观察结果,但如果 3 为真,那么(据我所知)完全不可能符合标准。
那么,有没有办法为符合标准的 vector 实现插入方法?还是这是标准缺陷?
可以在此处查看此问题的演示:http://coliru.stacked-crooked.com/a/afd2e838c34c8fcc
最佳答案
就我对标准的解释而言,这里的“除非另有说明”意味着一旦在特定容器的相应子句中为 insert
指定了有关异常的任何内容, §23.2.1 中的列表不再适用。
If an exception is thrown other than by the copy constructor [..] of
T
[..] there are no effects.
相反:当 T
的复制构造函数抛出异常时,不能保证调用不会产生任何影响。要求
if an exception is thrown by an
insert()
oremplace()
function while inserting a single element, that function has no effects
不适用:§23.3.6.5 规定“否则”。
关于c++ - 有没有办法为符合标准的 vector 实现插入方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27453230/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
在现代 IDE 中,有一个键盘快捷键可以通过键入文件名称来打开文件,而无需将手放在鼠标上。例如: Eclipse:Cmd|Ctrl + Shift + R -> 打开资源 IntelliJ:Cmd|C
有什么东西会等待事件发生(我正在等待的是 WebBrowser.DocumentCompleted),然后执行代码吗?像这样: If (WebBrowser.DocumentCompleted) 不会
我使用 PHP Minify,它很棒。但我的问题是,是否有任何 PHP 插件或其他东西可以自动检测 javascript/css 代码并自动缩小它?谢谢。 最佳答案 Javascript 压缩器? 看
有没有一种语言,类似什么CoffeeScript是JavaScript,编译成windows batch|cmd|command line的语言? 我指的cmd版本是基于NT的,尤其是XP sp3及以
我知道我可以 ,但是,我真的宁愿有一个任务,我可以从任何可以使用所有(或至少大部分)属性的操作系统调用 copy ,但这并没有消除 unix 上的权限。 我想知道是否已经有解决方案,或者我必须自己编
我正在使用 Vuejs(不使用 jQuery)开发一个项目,该项目需要像 jvectormap 这样的 map 但正如我所说,我没有使用 jQuery,那么是否有任何其他库可以在不使用 jQuery
想要进行一个简单的民意调查,甚至不需要基于 cookie,我不在乎投了多少票。有没有类似的插件或者简单的东西? 最佳答案 这是一个有用的教程 - 让我知道它是否适合您 using jQuery to
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
var FileBuff: TBytes; Pattern: TBytes; begin FileBuff := filetobytes(filename); Result := Co
我想要一个 vqmod xml 文件来添加一次上传多个图像的功能。身边有这样的事吗? 编辑:Opencart版本:2.1.0.1 最佳答案 最后我写了一个xml来添加到opencart 2.1.0.1
所以考虑这样的函数: public void setTemperature(double newTemperatureValue, TemperatureUnit unit) 其中Temperatur
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我是 ggplot2 的新手,一直在尝试找到一个全面的美学列表。我想我理解它们的目的,但很难知道哪些可以在各种情况下使用(主要是几何图形?)。 Hadley 的网站偶尔会在各个几何图形的页面上列出可用
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
是否有任何 PHP 函数可以将整数转换为十万和千万? 900800 -> 9,00,800 500800 -> 5,00,800 最佳答案 由于您已在问题标签中添加了 Yii,因此您可以按照 Yii
使用 Clojure 一段时间后,我积累了一些关于它的惰性的知识。我知道诸如map之类的常用API是否是惰性的。然而,当我开始使用一个不熟悉的API(例如with-open)时,我仍然感到怀疑。 是否
我的项目需要一个像 AvalonDock 这样的对接系统,但它的最后一次更新似乎是在 2013 年 6 月。是否有更多...积极开发的东西可以代替它? 最佳答案 AvalonDock 实际上相当成熟并
我正在寻找一个可以逆转 clojure 打嗝的函数 所以 turns into [:html] 等等 根据@kotarak的回答,这现在对我有用: (use 'net.cgrand.enliv
我是一名优秀的程序员,十分优秀!