很抱歉,您没有天真的问题,可以使用range函数将一个空集插入另一个集吗?还是未定义的行为?
在试运行https://ideone.com/RNGIFT似乎罚款,检查基准说 如果容器是空的,返回的迭代器将等于结束()。
#include <iostream>
#include <set>
using namespace std;
int main() {
std::set<string> to_be_inserted;
std::set<string> res;
cout << "check everything is fine" << endl;
res.insert(to_be_inserted.begin(), to_be_inserted.end());
cout << "how about now ?" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,C ++中与迭代器有关的大多数事情都可以在诸如空容器之类的边缘情况下以这种方式工作,因此在这种情况下,依赖于容器上的begin和end成员函数的算法不需要特殊的代码。
由于begin将在您显示的集合为空的情况下返回结束迭代器,因此它将有效地使范围为[end, end),其长度为0(可以通过诸如之类的函数进行检查std::distance),因此不执行任何插入操作(同时也定义的行为)。
这可以在实践中在标准库实现中看到,例如libc ++ ,其中插入的特定重载在for循环的范围内向下移动,for循环的两个迭代器(第一个和最后一个)的退出条件相等,插入元素为它去了。在将第一个和最后一个相等的空范围传递给它的情况下,它甚至不会进入循环。