Skip to content

Commit 529f8b8

Browse files
authored
第 29 条:对于逐个字符的输入请考虑使用 istreambuf_iterator
第 29 条:对于逐个字符的输入请考虑使用 istreambuf_iterator
1 parent 3344c25 commit 529f8b8

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

Effective-STL读书笔记.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,3 +686,19 @@ int test_item_28() {
686686
```
687687
如果要在一个reverse_iterator ri指定的位置上插入新元素,则只需在ri.base()位置处插入元素即可。对于插入操作而言,ri和ri.base()是等价的,ri.base()是真正与ri对应的iterator。
688688
如果要在一个reverse_iterator ri指定的位置上删除一个元素,则需要在ri.base()前面的位置上执行删除操作。对于删除操作而言,ri和ri.base()是不等价的,ri.base()不是与ri对应的iterator。
689+
690+
## 第 29 条:对于逐个字符的输入请考虑使用 istreambuf_iterator
691+
```c++
692+
int test_item_29() {
693+
// 把一个文本文件的内容拷贝到一个string对象中
694+
std::ifstream inputFile("interestingData.txt");
695+
inputFile.unsetf(std::ios::skipws); // 禁止忽略inputFile中的空格
696+
std::string fileData((std::istream_iterator<char>(inputFile)), std::istream_iterator<char>()); // 速度慢
697+
698+
std::string fileData2((std::istreambuf_iterator<char>(inputFile)), std::istreambuf_iterator<char>()); // 速度快
699+
700+
return 0;
701+
}
702+
```
703+
std::istream_iterator<char>对象使用operator>>从输入流中读取单个字符,而std::istreambuf_iterator<char>则直接从流的缓冲区中读取下一个字符。std::istreambuf_iterator不会跳过任何字符,它只是简单地取回流缓冲区中的下一个字符,而不管它们是什么字符,因此用不着清除输入流的skipws标志。
704+

0 commit comments

Comments
 (0)