Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代器<;T>;从istream,无格式提取_C++_C++11 - Fatal编程技术网

C++ 迭代器<;T>;从istream,无格式提取

C++ 迭代器<;T>;从istream,无格式提取,c++,c++11,C++,C++11,我需要一个迭代器来遍历std::istream中T类型的元素,其中T是一个整数类型 有没有办法不涉及到向量的中间副本 有关我努力实现目标的更多详细信息 我想要的是在概念上将输入流“强制转换”为T类型的元素数组的序列化,并对它们进行迭代 大概是这样的: std::vector<int> v {{ 1, 2, 3 }}; char *v_start = reinterpret_cast<char*>(v.data()); std::string v_s(v_start, v.

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

有没有办法不涉及到向量的中间副本

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

我想要的是在概念上将输入流“强制转换”为
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 
std::vector v{{{1,2,3};
char*v_start=reinterpret_cast(v.data());
std::string v_s(v_start,v.size()*sizeof(v[0]);//v作为字符串
std::stringstream s_s(v_s);//T=int的序列化数组
我的迭代器v_begin(s_s),v_end;//我想要什么
std::vector v_copy(v_begin,v_end);//现在v_copy与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::tuple
get_迭代器(std::istream&s)
{
返回std::make_tuple(
std::istreambuf_迭代器,
std::istreambuf_迭代器{}
);
}
不幸的是,它没有编译,因为
std::istreambuf\u迭代器
(注意名称中的“buf”)只能从
std::basic\u istream
构建,而我拥有的是
std::basic\u istream

我还尝试使用
std::istream_迭代器
,但不幸的是,它执行格式化的提取,也就是说,如注释中指出的,如果要提取格式化的值,您需要
std::istream_迭代器
而不是
std::istreambuf_迭代器
thermore,您不需要
元组
,而是

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>{});
}
模板
std::pair
get_迭代器(std::istream&s){
返回std::make_pair(std::istream_迭代器,std::istream_迭代器{});
}

正如评论中指出的,如果要提取格式化值,则需要
std::istream\u迭代器
而不是
std::istreambuf\u迭代器
。此外,您不需要
元组
,而是

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>{});
}
模板
std::pair
get_迭代器(std::istream&s){
返回std::make_pair(std::istream_迭代器,std::istream_迭代器{});
}

基本istream中的T不是关于您提取的对象,而是关于文本的基本字符类型。“有没有不涉及中间副本的方法来执行此操作?”您首先不能复制流。而且,很可能是您使用了错误的流。@black By“copy”我的意思是将一个流转储到一个向量中。@SebastianRedl:是的,但问题是,直到深入到我的函数中,我才知道底层类型是什么。我需要的是流的一个等价物void*。有这样的东西吗?你的意思是你有一个流向量,还是一个整数向量,你想从流中读取整数到vector?如果是后者,那么我建议您阅读,并且。基本流中的T不是关于您提取的对象,而是关于文本的基本字符类型。“有没有不涉及中间副本的方法?”您首先不能复制流。而且,很可能您使用的流是错误的。@black By“复制"我的意思是将一个流转储到一个向量中。@SebastianRedl:是的,但问题是,直到深入到我的函数中,我才知道底层类型是什么。我需要的是流的一个等价物void*。有这样的东西吗?你的意思是你有一个流向量,还是一个整数向量,你想从流中读取整数到vector?如果是后者,那么我建议您阅读,和。不幸的是,我想要的是无格式提取,这就是为什么我切换了
istreambuf_迭代器
不幸的是,我想要的是无格式提取,这就是为什么我切换了
istreambuf_迭代器