我发现=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>>
。
除了编译器错误之外还有解释吗?
答案 0 :(得分:2)
&#34;可能的编译器错误&#34;对C ++来说是什么&#34;它可能是Lupus&#34;是House MD。
话虽如此,在Documentation之后,您似乎正在使用该功能的 1)版本,其中明确指出:
1)使用运算符&lt;比较元素。并且范围必须按照相同的顺序排序。
您应该做的是将比较器传递给std::set_union
,根据该功能的 3)版本。
所以真正的谜团是:为什么有时会使用你的比较器。但是,由于您不尊重该函数的前提条件:
必须根据相同的范围对范围进行排序。
然后没有定义预期的行为,因此行为不是&#34;不正确&#34;。