- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在整个网络上,我看到人们使用 erase/remove idiom对于像这样的 C++ vector :
#include <vector> // the general-purpose vector container
#include <iostream>
#include <algorithm> // remove and remove_if
int main()
{
// initialises a vector that holds the numbers from 0-9.
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// removes all elements with the value 5
v.erase( std::remove( v.begin(), v.end(), 5 ), v.end() );
return 0;
}
也就是说,如果我想删除所有符合某些条件的元素(例如 int
s vector 中的数字 5),那么我使用 std::remove
或 std::remove_if
与 vector.erase
一起使用,如下所示:
vector.erase( std::remove( vector.begin(), vector.end(), <some_value>), vector.end());
总的来说,这很好用; std::remove
(和 remove_if
)将复制(或在 C++11 中使用移动语义)要删除的元素到 vector 的末尾,所以我们之前示例中的 vector 现在看起来像这样:
{ 0, 1, 2, 3, 4, 6, 7, 8, 9, 5 };
元素 5 加粗,因为它已移到末尾。
现在,std::remove
将返回一个迭代器,然后我们在 erase
中使用它来清除元素。不错。
int main()
{
// initialises an empty vector.
std::vector<int> v = {};
// removes all elements with the value 5
v.erase( std::remove( v.begin(), v.end(), 5 ), v.end() );
return 0;
}
这似乎在我运行它的所有平台上都按预期工作(不删除任何内容,不进行段错误等),但我知道仅仅因为某些东西在工作,并不意味着它不是未定义的行为。
快速 reference对于 vector.erase
这么说(强调我的):
iterator erase (const_iterator first, const_iterator last);
第一个,最后一个
是
Iterators specifying a range within the vector] to be removed:
[first,last)
. i.e., the range includes all the elements betweenfirst
andlast
, including the element pointed by first but not the one pointed bylast
. Member typesiterator
andconst_iterator
are random access iterator types that point to elements.
vector.erase(vector.end(),vector.end())
是未定义的行为吗?以下是快速引用中关于异常安全的内容:
If the removed elements include the last element in the container, no exceptions are thrown (no-throw guarantee). Otherwise, the container is guaranteed to end in a valid state (basic guarantee). An invalid
position
orrange
causes undefined behavior.
所以,至少在我看来,答案是"is",this StackOverflow answer似乎支持它。
假设它是未定义的行为,那么任何对 remove
的调用都可以返回一个迭代器到 vector.end()
应该在调用 vector.erase
,并且在空 vector 上调用 remove 似乎确实返回 vector.end
: (IDEOne for code below)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> myInts;
auto anIter = std::remove(myInts.begin(),myInts.end(),5);
if (anIter == myInts.end())
std::cout << "iterator = myInts.end()";
}
实际的删除/删除习语应该是这样吗?
auto endOfRangeIterator = std::remove(vector.begin(), vector.end(), <value>);
if (endOfRangeIterator != vector.end())
vector.erase(endOfRangeIterator, vector.end())
最佳答案
24.2.1/7 Most of the library’s algorithmic templates that operate on data structures have interfaces that use ranges. A range is a pair of iterators that designate the beginning and end of the computation. A range
[i,i)
is an empty range; in general, a range[i,j)
refers to the elements in the data structure starting with the element pointed to byi
and up to but not including the element pointed to byj
.
强调我的。
此外,您引用的erase
的描述不是标准中的规范文本。标准中有这样的说法(表 100):
a.erase(q1,q2)
Effects: Erases the elements in the range [q1, q2).
这并不要求 q1
是可取消引用的。如果 [q1, q2) 是空范围(根据 24.2.1/7),则范围内没有元素,因此不会删除任何元素。
关于c++ - std::remove 与 vector::erase 和未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23761273/
我想创建一个基于 jQuery 的非常简单的 html 编辑器(不是所见即所得)。 我的问题是如何制作 textarea或 div可能 在上面写一些文字 然后样式即标签(例如 some stuff 将
根据文档 isset 条款“测试此项目中是否已设置给定属性”。我不明白设置属性时 isset 返回 true 还是 false 在下面的代码片段中,当 env.JAVA_HOME 未设置时,java.
我正在尝试取消映射 o这是执行 :only 的默认命令( :help :only ),所以我尝试的第一件事是: nmap o 这种作品,除非我按 ,等待超过timeoutlen ms 然后按 o
我有以下型号: class MetaData(models.Model): created_at = models.DateTimeField(auto_now_add=True, auto_
下面列出了两行代码。两者对日期和时间的期望相同,但只有一个有效。我正在使用 R 3.1。 以下不起作用: DateTime2=strftime("08/13/2010 05:26:24.350", f
我有一个关于 C 代码的问题。 #include void foo(void){ int a; printf("%d\n",a); } void bar(void){
如果文件大小 > 8k,为什么读取的最后一个字节 = 0? private static final int GAP_SIZE = 8 * 1024; public static void main(
我有一个命令 Get-Testdata从不同来源检索测试数据并将这些数据存储到 PSObject以不同的值作为属性。然后将对象总数存储为数组,以便于操作、排序、计算等。 我的问题是我希望能够将这些数据
我正在使用 epoll 将大消息写入使用 HTTP 协议(protocol)的服务器。 fds 都设置为非阻塞,我正在使用边缘触发事件。我知道对于 EPOLLIN,我需要循环读取 fd,直到返回 EA
这对我来说听起来很奇怪: $test_1 = 'string'; $test_2 = '0'; var_dump(intval($test_1)); // Output: int 0 var_dump
这个问题在这里已经有了答案: Java: Integer equals vs. == (7 个回答) 7年前关闭。 请您解释以下行为。 public class EqAndRef { publ
Drupal 的行为到底是什么? 它为模块开发人员提供什么类型的服务层? 它映射到 jQuery.ready 的关系类型是什么? 最佳答案 长版:Drupal.behaviors 不仅仅是 jQuer
以下代码: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ for (int i=0
人们可以将项目添加到数据库中。我让他们选择在此时添加它,或手动选择日期。 因此我得到了这个 HTML 结构。 (请注意,我将日期和时间选择器妥协为只有一行文本) Selec
创建了一个数据框: simpleDF is.na(simpleDF$vals) [1] TRUE TRUE FALSE > is.nan(simpleDF$vals) [1] FALSE TRU
我有一个大的 docker 镜像 A,我创建了一个新的 Dockerfile FROM A RUN rm /big-folder 我尝试使用以下方法构建图像: docker build --squas
我想知道以下情况下 JVM 的行为是什么: JVM 最小堆大小 = 500MB JVM 最大堆大小 = 2GB 操作系统有 1GB 内存 JVM启动后,程序运行一段时间后,使用内存超过1GB。我想知道
我们正在使用 spikeearrest 策略,但我们不了解其工作原理。峰值逮捕配置如下: 5pm 阅读文档,我们了解到,如果我们在一分钟内调用此流超过 5 次,则该策略将在第 5 次之后
我正在使用 cURL 发送 POST 请求: curl http://tarvos.local:8080/partial_Users/2 -d '{currentPage : 1, firstID :
我的表中有 6442670 条记录,我正在使用以下命令获取它们jdbctemplate 使用行号一次 1000000 个。以下是查询 select * from (select rowNum rn
我是一名优秀的程序员,十分优秀!