确定传递的迭代器是否属于关联式std容器,是否有可能?

3

我希望能够从传递给函数的迭代器确定std容器类型(至少是关联或线性)。

我已经搜索了相应的迭代器特征和类型特征,但没有找到合适的。

template <typename RangeIter, typename InputIter>
inline bool filter(RangeIter in_data, InputIter result)
{
...
    /* determine the container types here - but how?!? */
    std::copy_if(in_data.first, in_data.second, result, /* some predicate code here*/);
...
}

6
你能举例解释一下你试图解决的问题吗?我不清楚你如何使用这个信息。我怀疑真正的解决方案是你不需要确定这个问题。这是件好事,因为实际上我认为你做不到。 - François Andrieux
4
迭代器接口的整个意义在于将容器与访问分离。你可以接受一个函数对象来完成想要的操作。 - NathanOliver
1
@ttuna 我相信它仍然是正确的。编辑:我没有直接关闭问题的原因是重复问题没有考虑到区分关联和顺序容器的简单方法。 - François Andrieux
3
请勿错误标记问题类型,以防止有人将问题视为重复并将其关闭,仅因为您不同意关闭该问题。这不是标记问题类型的目的。 - Nicol Bolas
3
@Bathsheba:关于C++的问题应该总是标记为C++。它们可以有更具体的版本标记,但几乎没有问题仅应标记为特定版本标记。此外,概念对于这个问题不会产生任何影响,因为迭代器模型是围绕着制作算法而设计的,这些算法对数据序列来源的大多数特定细节都是无知的。 - Nicol Bolas
显示剩余19条评论
1个回答

0

不行(好吧,这可能对于StackOverflow来说有点太短了)。

没有办法确定迭代器所引用的“容器”,因为它们可能根本不引用容器。

例如:

int foo, bar;
std::copy(&foo, &foo+1, &bar);

在这个例子中,传递给 std::copy 的迭代器都没有引用到一个“容器”。

你可以看出它目前并没有使用标准中的任何关联容器。这是一个稍微不那么一般化的说明,但如果这对你来说足够好,那么你可以开始了。 - Marshall Clow
@ttuna,你是怎么得出value_typeint的迭代器不能来自关联容器(例如std::set<int>)的结论的? - Zereges
@Zereges 是的,但对于集合,我的优化不需要区分。 - ttuna
@ttuna 那对我来说似乎是一个 XY 问题 - Zereges
刚看到这个答案,不禁想知道示例代码是否应该改为 std::copy(&foo, (&foo) + 1, &bar); 呢?因为你怎么解引用 foo + 1 的临时值结果呢? - PluginPenguin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接