【问题标题】:Is it possible to determine if a passed iterator belongs to a associative std container?是否可以确定传递的迭代器是否属于关联 std 容器?
【发布时间】:2019-12-24 18:35:49
【问题描述】:

我想从传递给函数的迭代器中确定标准容器类型(至少是关联的或线性的)。

我已经搜索了合适的迭代器特征和类型特征,但没有成功。

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*/);
...
}

【问题讨论】:

  • 你能举一个你试图解决的问题的例子吗?我不清楚你将如何使用这些信息。我怀疑真正的解决方案是您不需要确定这一点。这是一件好事,因为实际上我认为你做不到。
  • 迭代器接口的重点是将容器与访问解耦。你能做的就是接受一个能做你想做的事情的函子。
  • @ttuna 我相信它仍然是正确的。编辑:我没有直接关闭问题的原因是重复并不能简单地区分关联容器和顺序容器。
  • @Bathsheba:不要仅仅因为您不同意关闭问题而错误地标记问题以防止有人将问题关闭为重复项。这不是标记的用途。
  • @Bathsheba:有关 C++ 的问题应始终标记为 C++。他们也可以有更具体的版本标签,但几乎没有问题应该用 just 一个特定于版本的标签来标记。此外,关于这个问题,概念不会改变任何东西,因为迭代器模型设计围绕着使算法对数据序列源的大多数特定细节一无所知。

标签: c++ iterator containers c++20


【解决方案1】:

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

无法确定迭代器引用的“容器”,因为它们根本不需要引用容器。

例子:

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

在此示例中,传递给 std::copy 的迭代器都没有引用“容器”。

【讨论】:

  • 感谢您的回答。在您的示例中,我仍然可以从“迭代器”派生 value_type,它告诉我您没有使用关联容器;-)
  • 嗯,您可以看出它没有使用任何当前标准中的关联容器。这是一个不太笼统的陈述,但如果这对你来说足够好,那么你就可以开始了。
  • 感谢您的提示。我已经编辑了标题/帖子。但就像@Barry 在他的comment 中提到的那样,还有一个未解决的问题......
  • @ttuna 你是如何推导出 value_typeint 的迭代器不能来自关联容器(例如 std::set&lt;int&gt;
  • @Zereges 是的,但对于集合,我的优化没有必要区分。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 2021-06-09
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多