- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在我的项目中,我想将流拆分为一些给定类型的值,所以我实现了一个模板函数
template <typename TElem, typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
TElem elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
我认为这很尴尬,因为我必须在调用时明确给出 TElem
的类型。例如,我必须写:
std::vector<int> v;
SplitSpace<int>(std::cin, back_inserter(v));
// I want to it to be SplitSpace(std::cin, back_inserter(v));
我尝试从(模板)迭代器中获取值类型,并使用 std::iterator_traits
如下:
template <typename TOutputIter>
TOutputIter SplitSpace(std::istream& IS, TOutputIter result)
{
typename std::iterator_traits<TOutputIter>::value_type elem;
while (IS >> elem)
{
*result = elem;
++result;
}
return result;
}
但是,上述代码不适用于 back_insert_iterator
。我检查了 std
命名空间中 back_insert_iterator/front_insert_iterator/insert_iterator
的源代码,发现 value_type/difference_type/pointer/reference
都是 无效
。
我想知道为什么这些类型都是void
,有什么考虑吗?另一个问题是,是否可以实现 SplitSpace
函数,而无需在调用时明确给出元素类型?谢谢。
最佳答案
value_type
在 OutputIterators 的情况下没有多大意义,因为输出迭代器不能访问任何值,更重要的是它可以接受广泛的值类型。
对 OutputIterator 的唯一要求 it
是它必须支持表达式*it = o
在哪里 o
是某个类型的值,它位于可写入 i 的特定迭代器类型的类型集中(第 24.2.1 节)。这意味着输出迭代器可以潜在地接受多种类型:例如,它的 operator*
可以返回一个重载的代理对象 operator=
适用于多种类型;应该是value_type
在这种情况下?
例如,考虑以下输出迭代器:
struct SwallowOutputIterator :
public std::iterator<output_iterator_tag, void, void, void, void>
{
struct proxy // swallows anything
{
template <typename T>
void operator=(const T &) {}
};
proxy operator*()
{
return proxy();
}
// increment operators
};
value_type
没有明智的选择在这里。
同样的道理也适用于 pointer
和 reference_type
. difference_type
未定义,因为您无法计算两个输出迭代器之间的距离,因为它们是单程的。
注意:标准明确指出 insert_iterator
并且它的兄弟必须继承自 iterator<output_iterator_tag, void, void, void, void>
,所以这不是您的实现的特殊性。
关于c++ - 为什么 back_insert_iterator/front_insert_iterator/insert_iterator 的 value_type/difference_type/pointer/reference 都是 void?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16165635/
由于无聊和想要一些练习(所以,请不要告诉我 just use Boost :-))我目前正在实现一个 STL 风格的计数迭代器。 但是,在实现需要将 difference_type 定义为有意义的东西
当我尝试使用 std::distance 时使用 gcc 4.7 下的自定义迭代器,它提示找不到 difference_type .遗憾的是,我不知道为什么会失败。 #include class n
我正在为第 3 方 C 库编写 C++ 包装器。 该库提供了一些用于迭代一系列对象的函数。 我想编写一个迭代器来包装此行为,以便迭代更容易,但我想不出我将如何提供强制性的“差异”类型,因为迭代对象没有
我有一些序列化逻辑,其中我还序列化了 STL 数据结构。目前,我只是编写大小字段,然后通过遍历它来编写结构的每个元素。在反序列化中,我读取了大小字段,然后我知道何时读取完数据结构。 不,问题是如何正确
vector两者都有vector::size_type和 vector::difference_type .从size_type 开始,两者似乎都没有必要存在。保证能够保存与 vector 的最大元素
今天我正在替换一个低级的 C 风格的方法,该方法将缓冲区保存到文件中。整个事情看起来像这样: bool Profile::save(const char* path) { FILE* p
我看到 iterator_traits 总是定义一个 difference_type:https://en.cppreference.com/w/cpp/iterator/iterator_trait
我正在尝试找出 difference_type 成员对于满足 std::weakly_incrementable 的重要性概念。我目前正在定义一个满足 std::output_iterator 的类,
我正在尝试使用 reverse_iterator 从反向位置删除列表的特定项目。但是 STL_iterator.h 头文件中出现编译错误。 我正在尝试做... 这里的input[]是一个整数数组。
为什么返回类型是 std::count difference_type迭代器(通常是 ptrdiff_t )。 由于计数永远不会是负数,所以 size_t 技术上正确的选择?如果计数超出 ptrdif
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why does the C++ standard algorithm “count” return a pt
在我的项目中,我想将流拆分为一些给定类型的值,所以我实现了一个模板函数 template TOutputIter SplitSpace(std::istream& IS, TOutputIter r
我正在尝试使用这个 vector.h 函数: random_shuffle(s.begin()+from+i,s.begin()+to,s); 发生此错误: c:\program files (x8
我是一名优秀的程序员,十分优秀!