我不是C++程序员,很难理解网站上给出的解释。我不了解容器或迭代器,并且没有计划在近期学习C++。因此,简单来说:STL是什么?它对我有什么帮助?与Python标准库或glibc相比如何?
for_each()
函数,它允许你对序列中的每个元素应用一个函数,到相关的transform()
函数,它将一个函数应用于每个元素,并将结果存储到一个单独的序列中(非常类似于函数式语言中的map操作),或者累加(类似于函数式语言中的fold),还有排序或搜索函数,以及允许您复制整个序列的函数。请注意,这三个领域之间没有重叠。容器存储(并拥有)数据,并生成迭代器。迭代器允许您检查、修改和遍历数据。算法操作迭代器范围
从概念上讲,迭代器有两个功能。它指向一些数据,并且可以在序列中移动(根据迭代器类型,不同的移动操作可能可用。几乎所有迭代器都可以移动到下一个元素。有些迭代器也可以移动到前一个元素,而有些可以向后和向前跳过任意距离)。 如果您熟悉C语言,这听起来很像指针,这不是巧合。迭代器被建模为指针的概括,并且实际上,指针也是有效的迭代器。所有STL算法也适用于指针以及“真正”的迭代器。
这意味着任何数据序列都可以由一对迭代器表示:第一个迭代器指向序列中的第一个元素,第二个迭代器指向序列结尾后的一个位置。
这允许以相当简单的语法遍历序列:
std::vector<int> container;
for (iter it = container.begin(); it != container.end(); ++it)
{
// perform some operations on the iterator (it) or the element it points to (*it)
++(*it); // increment the value the iterator points to
}
或者我们可以对这个序列应用一个算法:
std::sort(container.begin(), container.end());
请注意,sort函数并不知道也不关心它正在处理一个向量。它会传递两个迭代器,并且这些迭代器可以是任何类型。它们可以是指向数组的普通指针,链表迭代器或任何其他有效的迭代器类型。
我们可以通过提供自己的比较函数(任何接受两个值并在第一个值严格小于另一个值时返回true的函数)来将排序函数进行泛化。
// sort in descending order, by passing in a custom comparer which uses greater than instead of less than
bool greater(int lhs, int rhs) { return lhs > rhs; }
std::sort(container.begin(), container.end(), greater);
当然,我们也可以仅对向量的前五个元素进行排序:
std::sort(container.begin(), container.begin()+5);
begin()和end()函数只是从容器中获取迭代器的便捷函数,我们不必直接使用它们。
另一个不错的技巧是将流也广义化为迭代器。因此,让我们从文件中读取所有整数,并将它们复制到数组中(数组当然是普通的C类型,因此它们不是适当的容器,也没有迭代器。但指针可以正常工作)。
int arr[1024];
std::ifstream file("something.txt");
// (note, this assumes <= 1024 integers are read)
std::copy(std::istream_iterator<int>(file) // create an iterator pointing to the current position in the file stream
, std::istream_iterator<int>() // and our "end" iterator. When we reach the end of the stream, testing the two iterators for equality will yield true, and so the operation will halt
, arr);
STL的独特之处在于其灵活性和可扩展性。它与C代码互操作清晰(指针可以作为合法的迭代器),它可以简单而轻松地扩展(如果您愿意,可以编写自己的迭代器类型)。大多数算法使用比较器的自定义谓词(如上面所示的),您可以定义自己的容器。也就是说,STL的三个支柱中的每一个都可以被覆盖或扩展,因此STL可以说是一种设计策略而不仅仅是一个库。即使您正在使用自己的容器、迭代器和算法,您也可以编写STL代码。由于这三个支柱都与其他支柱干净地分离,因此它们可以比大多数其他语言更容易地交换,而这三个责任在大多数其他语言中则是混在一起并由相同的类共享。
算法不知道它正在操作的序列存储在哪个容器中,如果有的话。它只知道它被传递的迭代器可以被解引用以获取对数据本身的访问。
容器不必支持所有标准算法。它只需能够产生一对迭代器,然后所有功能就会免费提供。
将其与Java进行比较,Java中每个集合类都必须实现自己的搜索、排序和其它所有功能。在C++中,我们只需要一个find()函数的实现。它接受两个迭代器和要查找的值,然后遍历序列寻找该值。因此,它适用于任何容器类型,甚至包括我定义的容器。
STL的另一个显著特点是几乎没有性能损失。C++模板都在编译时替换,产生的代码可以像手动编写C代码一样进行优化。上面的sort函数会失去一些性能,因为我将一个函数指针作为自定义比较器传递给它,这通常无法内联,但如果我们将其定义为这样:
struct greater {
bool operator()(int lhs, int rhs) { return lhs > rhs; }
};
std::sort(container.begin(), container.end(), greater());
现在我们不再传递函数指针,而是一个对象。成员函数(例如operator())可以被内联。因此,这个排序函数将和你手写的任何C代码一样有效。STL是标准模板库,它是C++标准库的一个子集。
STL提供了有用算法和容器的通用实现。
容器提供了一种在程序中存储数据、查找、排序以及执行其他计算的简单方法。
如果你不是C++程序员,标准模板库的实现对你来说毫无价值。然而,这些思想超越了任何编程语言。
它是一个数据结构库(例如,映射、列表、向量等)。它包括迭代器来抽象遍历这些数据结构,并提供操作它们的算法。其他语言也使用这些思想,因此如果你在一种语言中学习了它们,它们将在其他语言中变得熟悉。
STL是标准模板库。它是一个包含函数和类的库,您可以使用它。它具有基本计算机科学的许多基本算法和数据结构。如果您打算继续使用C++,则应该计划学习此库或其他资源库。
这段代码被全球许多人使用,因此您可以放心,代码经过了充分测试并广为人知。
这是一个库,可以使某些事情更容易,例如字符串操作、向量、链表等。STL 可以帮助你避免编写一些底层代码,让你更专注于应用程序代码。
class
(或对象),需要使用foo<>
尖括号,并且是许多“泛型”库(如 Java、C# 等)的前身。 - ebyrob?:
不存在,而不解释只是“-1”风格。 - ebyrob