gpt4 book ai didi

c++ - std::istream_iterator<> 与 copy_n() 和 friend

转载 作者:IT老高 更新时间:2023-10-28 12:54:37 25 4
gpt4 key购买 nike

下面的代码片段从 std::cin 中读取三个整数;它将两个写入 numbers 并丢弃第三个:

std::vector<int> numbers(2);
copy_n(std::istream_iterator<int>(std::cin), 2, numbers.begin());

我希望代码从 std::cin 中准确读取两个整数,但事实证明这是一个正确的、符合标准的行为。这是对标准的疏忽吗?这种行为的基本原理是什么?


从 C++03 标准中的 24.5.1/1 开始:

After it is constructed, and every time ++ is used, the iterator reads and stores a value of T.

所以在上面的代码中,流迭代器在调用点已经读取了一个整数。从那时起,算法中迭代器的每次读取都是预读,产生从前一次读取缓存的值。

下一个标准的最新草案,n3225 ,这里似乎没有任何变化(24.6.1/1)。

在相关说明中,当前标准的 24.5.1.1/2 引用 istream_iterator(istream_type& s) 构造函数读取

Effects: Initializes in_stream with s. value may be initialized during construction or the first time it is referenced.

强调“ 可能被初始化...”而不是“被初始化”。这听起来与 24.5.1/1 相矛盾,但也许这值得自己提出一个问题。

最佳答案

不幸的是,copy_n 的实现者未能解释复制循环中的预读。 Visual C++ 实现在 stringstream 和 std::cin 上都可以正常工作。我还检查了原始示例中 istream_iterator 是按行构造的情况。

这是来自 STL 实现的关键代码。

template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest, input_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary input
*_Dest = *_First; // 0 < _Count has been guaranteed
while (0 < --_Count)
*++_Dest = *++_First;
return (++_Dest);
}

这是测试代码

#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <iterator>

int _tmain(int argc, _TCHAR* argv[])
{
std::stringstream ss;
ss << 1 << ' ' << 2 << ' ' << 3 << ' ' << 4 << std::endl;
ss.seekg(0);
std::vector<int> numbers(2);
std::istream_iterator<int> ii(ss);
std::cout << *ii << std::endl; // shows that read ahead happened.
std::copy_n(ii, 2, numbers.begin());
int i = 0;
ss >> i;
std::cout << numbers[0] << ' ' << numbers[1] << ' ' << i << std::endl;

std::istream_iterator<int> ii2(std::cin);
std::cout << *ii2 << std::endl; // shows that read ahead happened.
std::copy_n(ii2, 2, numbers.begin());
std::cin >> i;
std::cout << numbers[0] << ' ' << numbers[1] << ' ' << i << std::endl;

return 0;
}


/* Output
1
1 2 3
4 5 6
4
4 5 6
*/

关于c++ - std::istream_iterator<> 与 copy_n() 和 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5074122/

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