我需要浏览一个集合并删除符合预定义条件的元素.
这是我写的测试代码:
#include <set>
#include <algorithm>
void printElement(int value) {
std::cout << value << " ";
}
int main() {
int initNum[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::set<int> numbers(initNum, initNum + 10);
// print '0 1 2 3 4 5 6 7 8 9'
std::for_each(numbers.begin(), numbers.end(), printElement);
std::set<int>::iterator it = numbers.begin();
// iterate through the set and erase all even numbers
for (; it != numbers.end(); ++it) {
int n = *it; …Run Code Online (Sandbox Code Playgroud) Erlang文档说明了以下关于gen_servers的内容:
...
请注意,出于正常,关闭或{shutdown,Term}之外的任何其他原因,假定gen_server由于错误而终止,并使用error_logger:format/2发出错误报告.
资料来源:http://www.erlang.org/doc/man/gen_server.html#Module : terminate-2
由于除了这三个原因以外的任何原因都被认为是错误,我推断其原因normal,shutdown并被{shutdown, Reason}认为是正常行为.
我想在开发人员选择这三个理由在正常情况下停止gen_server时,开发人员有动机,但我不太确定如何确定使用哪一个.
所以,当我应该使用normal,shutdown并{shutdown, Reason}?
我发现可以使用接受迭代器的erase方法从另一个集合中删除一个集合中的元素.我无法解释为什么会发生这种情况,我想知道这是否是正常行为.
所以,让我们设置场景:
由于逻辑原因(即,它们是不相交的集合),我有一组在两个STL集中分隔的对象.
std::set<Obj> set_a;
std::set<Obj> set_b;
Run Code Online (Sandbox Code Playgroud)
set_a包含我想要的对象.如果在set_a中找不到此对象,则创建一个空对象并将其插入set_b.然后我对所需对象执行一些计算,如果满足某个条件,我将其删除.
std::set<Obj>::iterator it = set_a.find(o);
std::set<Obj>::iterator end = set_a.end();
if (it == end) {
it = set_b.lower_bound();
end = set_b.end();
if (it == end || *it != o) {
it = set_b.insert(it, o);
}
}
// do calculations with it
if (/*condition is met*/) {
// erase it
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道如何删除这个对象.由于我有迭代器,我想删除直接使用它.但是当你使用擦除迭代器"指向"另一组中的对象时会发生什么?我使用的文档中没有任何内容(http://www.cplusplus.com/reference/stl/set/erase/),所以我做了以下测试.
#include <iostream>
#include <iterator>
#include <algorithm>
#include <set>
#include <sstream>
// streams
using std::cout;
using std::ostream_iterator;
using std::ostringstream;
// data structures
using std::set; …Run Code Online (Sandbox Code Playgroud)