将空值插入另一个集合中可以吗?

时间:2019-06-05 01:51:48

标签: c++

很抱歉,您没有天真的问题,可以使用范围函数将空集插入另一个集吗?还是未定义的行为?

https://ideone.com/RNGIFT中运行测试似乎很好,请检查reference的说法 如果容器为空,则返回的迭代器将等于end()。

#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;
}

1 个答案:

答案 0 :(得分:8)

是的,C ++中与迭代器有关的大多数事情在诸如空容器之类的边缘情况下都将以这种方式工作,因此依赖于容器上的beginend成员函数的算法不需要在容器中使用特殊代码这种情况。

由于begin将在您显示的集合为空的情况下返回结束迭代器,因此它将有效地使[end, end)的范围为0(可以检查)通过std::distance之类的函数实现),因此不会执行任何插入操作(同时也是已定义的行为)。

这可以在实践中在标准库实现中看到,例如libc ++ here,其中特定的insert重载通过for循环沿范围下降,该循环具有两个迭代器(第一个和最后一个)的退出条件)相等,则插入元素。在将第一个和最后一个相等的空范围传递给它的情况下,它甚至都不会进入循环。