std :: set inserter不尊重自定义比较器。 (可能编译错误?)

时间:2018-05-14 01:41:08

标签: c++ gcc compiler-errors

我发现=IMPORTXML("https://www.x-rates.com/historical/?from=USD&amount=1&date= & TO_TEXT(B1) , "//tr[position()>1]//a[@href='http://www.x-rates.com/graph/?from=EUR&to=USD']")上的std::inserter并不总是尊重自定义比较器,而是有时会回归到默认std::map<T, C> / operator< 。有没有人有这方面的经验?考虑到零星的性质,我觉得它可能是一个编译器错误。特别是,我有这样的功能:

std::less

但这并不总是使用我的自定义template <typename T, typename C> std::set<T, C> operator|(const std::set<T, C> &lhs, const std::set<T, C> &rhs) { std::set<T, C> out; std::set_union(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), inserter(out, out.end())); return out; } 比较器,有时(我知道,我也希望能找到模式)只会使用C代替。如果我用std::less的maunal构造替换它,一切正常:

std::insert_iterator<std::set<T, C>>

我觉得这可能是编译器错误(gcc版本7.3.0),因为http://en.cppreference.com/w/cpp/iterator/inserter上提供的引用描述template <typename T, typename C> std::set<T, C> operator|(const std::set<T, C> &lhs, const std::set<T, C> &rhs) { std::set<T, C> out; std::set_union(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), std::insert_iterator<std::set<T, C>>(out, out.end())); return out; } 只需委托给inserter

insert_iterator

此外,官方C ++标准,第24.5.2.5节(通过http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf访问,第859页)将inserter的定义作为返回与第一个参数中传递的相同类型的插入迭代器:

template< class Container >
std::insert_iterator<Container> inserter( Container& c, typename Container::iterator i )
{
    return std::insert_iterator<Container>(c, i);
}

这里显然没有发生,因为返回的template <class Container> insert_iterator<Container> inserter(Container& x, typename Container::iterator i); 适用于insert_iterator类,而不是std::set<T, C = std::less<T>>

除了编译器错误之外还有解释吗?

1 个答案:

答案 0 :(得分:2)

&#34;可能的编译器错误&#34;对C ++来说是什么&#34;它可能是Lupus&#34;是House MD。

话虽如此,在Documentation之后,您似乎正在使用该功能的 1)版本,其中明确指出:

  

1)使用运算符&lt;比较元素。并且范围必须按照相同的顺序排序。

您应该做的是将比较器传递给std::set_union,根据该功能的 3)版本。

所以真正的谜团是:为什么有时会使用你的比较器。但是,由于您不尊重该函数的前提条件:

  

必须根据相同的范围对范围进行排序。

然后没有定义预期的行为,因此行为不是&#34;不正确&#34;。