STL是C++中非常强大的库。它强烈地基于模板编程的原理。
STL库具有三个主要组件:
- 容器:这些类定义用于包含数据的数据结构。数据可以存储在链表,树或数组中。 STL中提供的容器是矢量,出队,列表,转发列表,集合,多集,映射和多图。
- 算法: STL库还为我们提供了处理容器中存储的数据的功能。这些函数在算法头文件中提供
- 迭代器:迭代器是容器和算法之间的链接。它们是这些类的通用接口。迭代器是一个对象,可用于对容器中的元素进行迭代。因此,算法使用迭代器来修改容器。
所有这三个组件都经过精心设计,以确保它们符合数据抽象的原理。因此,任何保存数据并表现得像容器的对象都是容器。同样,任何遍历容器中元素的迭代器都是一个迭代器。
如果可以使用迭代器访问数据容器的元素,那么流又如何呢?为了与设计保持一致,Streams也是数据容器,因此C++为我们提供了迭代器,以迭代任何流中存在的元素。这些迭代器称为流迭代器。要使用这些迭代器,必须包含迭代器头文件。
流迭代器可以是输入流迭代器,也可以是输出流迭代器。这些迭代器的类为istream_iterator和ostream_iterator。这些迭代器的行为分别类似于输入迭代器和输出迭代器。
istream_iterator
istream_iterator的类定义
namespace std {
template < typename T, typename charT=char,
typename traits=char_traits >
class istream_iterator;
}
句法 :
istream_iterator(stream)
T: Template parameter for specifying type of data
stream: The object representing the stream
ostream_iterator(stream, delim).
stream: The object representing the stream.
T: Template Parameter for data type in the stream
delim: An optional char sequence that is used to
separate the data items while displaying them.
笔记 :
- 使用迭代器,我们只能访问一种类型的元素。
- istream_iterator具有流迭代器的特殊状态结束,当到达流的末尾或输入操作失败时,将获取它。流迭代器的结尾由默认构造函数返回。
ostream_iterator
ostream_iterator的类定义
namespace std {
template < typename T, typename charT=char,
typename traits=char_traits >
class ostream_iterator;
}
句法 :
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
first: Input Iterator to the first element
in source from where elements need to be copied.
last: Input Iterator to the last element
in source till where elements need to be copied.
result: Output iterator to the first element
in the destination container to where elements will copied.
Return Value: Iterator pointing to the last element that was copied to the destination.
第二个和第三个模板参数具有分配给它们的默认值。我们只需要指定第一个模板参数,该参数指定流中存在的数据类型,即流是否包含整数,浮点数或字符串。
例子 :
istream_iterator cin_it(cin) is an iterator for the stream cin.
ostream_iterator cout_it(cout, " ") is an iterator for the stream cout.
ostream_iterator cout_it(cout) is an iterator for stream cout, with no delimeter.
流迭代器的重要性
流迭代器的优点是,它们提供了一个公共接口来访问I / O流,文件流以及其他流到外部物理设备的元素。
- 一旦获得了对各个流的迭代器,则后面的代码在所有类型的流中几乎都是相同的。
- 因此,诸如从输入流读取和从另一个外部流读取的任务变得相似。
- 流迭代器使我们能够访问所有强大的STL算法,例如for_each,replace_if,它们需要输入范围进行操作。一个特别有用的函数是copy()函数。此函数用于将元素从一个容器复制到另一个容器。
- 使用copy()函数,我们可以轻松地将数据从流传输到容器,反之亦然。以下是一些示例程序,以演示如何使用流迭代器
例子1
// Cpp program to illustrate
// Read a bunch of integers from the input stream
// and print them to output stream
#include
#include
#include
using namespace std;
int main()
{
// Get input stream and end of stream iterators
istream_iterator cin_it(cin);
istream_iterator eos;
// Get output stream iterators
ostream_iterator cout_it(cout, " ");
// We have both input and output iterators, now we can treat them
// as containers. Using copy function we transfer data from one
// container to another.
// Copy elements from input to output using copy function
copy(cin_it, eos, cout_it);
return 0;
}
Input: 1 2 3 4 5
Output: 1 2 3 4 5
例子2
// Cpp program to illustrate
// Read a bunch of strings from a file
// sort them lexicographically and print them to output stream
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
// Define a vector to store the strings received from input
vector strings_v;
// Define the filestream object used to read data from file
ifstream fin("input_file.txt");
// Get input stream and end of stream iterators
istream_iterator fin_it(fin);
istream_iterator eos;
// Get output stream iterators
ostream_iterator cout_it(cout, " ");
// Copy elements from input to vector using copy function
copy(fin_it, eos, back_inserter(strings_v));
// Sort the vector
sort(strings_v.begin(), strings_v.end());
// Copy elements from vector to output
copy(strings_v.begin(), strings_v.end(), cout_it);
return 0;
}
Contents of File "input_file.txt": quick brown fox jumps over the lazy dog
Output: brown dog fox jumps lazy over quick the
范例3:
// Cpp program to illustrate
// Read a bunch of integers from the stream
// print the sorted order of even integers only
#include
#include
#include
#include
using namespace std;
int main()
{
// Define a vector to store the even integers received from input
vector vi;
// Get input stream and end of stream iterators
istream_iterator cin_it(cin);
istream_iterator eos;
// Get output stream iterators
ostream_iterator cout_it(cout, " ");
// Copy even integer elements from input to vector using for_each function
for_each(cin_it, eos, [&](int a) {
if (a % 2 == 0) {
// if a is even push it to vector
vi.push_back(a);
}
});
// Sort the vector
sort(vi.begin(), vi.end());
// Copy elements from vector to output
copy(vi.begin(), vi.end(), cout_it);
return 0;
}
Input: 1 4 3 2 6 8 31 52
Output: 2 4 6 8 52
参考:
istream_iterator
ostream_iterator
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。