gpt4 book ai didi

c++ - Iterator 来自 istream,无格式提取

转载 作者:太空宇宙 更新时间:2023-11-04 13:24:20 24 4
gpt4 key购买 nike

我需要一个遍历 T 类型元素的迭代器来自std::istream , 其中T是整数类型。

有什么方法可以不涉及 vector 的中间拷贝吗?

有关我正在努力实现的目标的更多详细信息

我想要的是在概念上将输入流“转换”为类型为 T 的元素数组的序列化。并遍历它们。

像这样:

std::vector<int> v {{ 1, 2, 3 }};
char *v_start = reinterpret_cast<char*>(v.data());
std::string v_s(v_start, v.size() * sizeof(v[0]); // v as a string
std::stringstream s_s(v_s); // serialized array of T = int
my_iterator<int> v_begin(s_s), v_end; // What I want
std::vector<int> v_copy(v_begin, v_end); // Now v_copy is the same as v

这是我尝试过的:

template <typename T>
std::tuple<std::istreambuf_iterator<T>, std::istreambuf_iterator<T>>
get_iterator(std::istream &s)
{
return std::make_tuple(
std::istreambuf_iterator<T>(s),
std::istreambuf_iterator<T>{}
);
}

不幸的是它没有编译因为std::istreambuf_iterator<T> (注意名称中的“buf”)只能从 std::basic_istream<T> 构建,我有一个 std::basic_istream<char> .

我还尝试使用 std::istream_iterator<T> ,但不幸的是,它执行的是格式化提取,即它使用operator<<提取元素。 ,这与提取 T 类型的元素非常不同通过执行原始 read调用。

最佳答案

作为@Dietmar Kuhl在评论中指出,如果你想提取你想要的格式化值 std::istream_iterator<T>不是std::istreambuf_iterator<T> .此外,您不需要 tuple但是一个pair :

template <typename T>
std::pair<std::istream_iterator<T>, std::istream_iterator<T>>
get_iterator(std::istream &s) {
return std::make_pair(std::istream_iterator<T>(s), std::istream_iterator<T>{});
}

Live Demo

关于c++ - Iterator<T> 来自 istream,无格式提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33859155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com