【问题标题】:Can output of set difference be stored in first input?设置差异的输出可以存储在第一个输入中吗?
【发布时间】:2014-02-07 02:55:26
【问题描述】:

如果我有 2 个向量(或双端队列):

我可以将它们的 set_difference 存储在第一个向量中吗?

这个例子来自 cpp wiki 参考:

std::vector<int> v1 {1, 2, 5, 5, 5, 9};
std::vector<int> v2 {2, 5, 7};
std::vector<int> diff;

std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), 
                    std::inserter(diff, diff.begin()));

如果改成:

std::vector<int> v1 {1, 2, 5, 5, 5, 9};
std::vector<int> v2 {2, 5, 7};

std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), 
                    v1.begin());

注意第一个输入是指第一个向量,是的,我知道 STL 适用于范围,而不适用于容器。

【问题讨论】:

    标签: c++ c++11 stl


    【解决方案1】:

    从 N3797,§25.4.5.4/2 [set.difference]

    要求:结果范围不得与任何一个原始范围重叠。

    因此,如果您尝试将结果写入任一输入范围,行为将是不确定的。

    【讨论】:

    • 我错误地认为它适用于 dest.begin() 与 first.begin() 完全相同,也就是他们过度指定了要求
    • @NoSenseEtAl 该算法只需要 InputIterators,因此保证单次通过。所以我们知道,一旦读取了first.begin(),算法就不会再次读取它,在这种情况下你所说的是有道理的。但也许允许写入输入范围被认为对算法的实现过于严格。例如,当传递一个 ForwardIterator 或更好时,也许使用多次传递可以使算法更有效。
    • 为什么任何算法都会使用多次传递等?对我来说,它似乎也被过度指定了。
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多