2

我是一名 Java 开发人员。我目前正在学习 C++。我一直在查看用于排序的代码示例。在 Java 中,通常会为排序方法提供它需要排序的容器,例如

sort(Object[] someArray)

我注意到在 C++ 中你传递了两个参数,即容器的开始和结束。我的问题是如何访问实际的容器?

这是取自维基百科的示例代码,说明了排序方法

#include <iostream>
#include <algorithm>
#include <vector>
int main() {
 std::vector<int> vec;
 vec.push_back(10); vec.push_back(5); vec.push_back(100); 
 std::sort(vec.begin(), vec.end());
 for (int i = 0; i < vec.size(); ++i) 
     std::cout << vec[i] << ' ';
}
4

5 回答 5

3

vec.begin()vec.end()返回迭代器迭代器。迭代器是元素上的一种指针,您可以使用迭代器读取和修改它们。这就是 sort 使用迭代器所做的事情。

如果是迭代器,可以直接修改迭代器所指的对象:

*it = X; 

排序函数不必知道容器,这是迭代器的强大功能。通过操作指针,它可以对完整的容器进行排序,甚至不知道它到底是什么容器。

您应该了解迭代器(http://www.cprogramming.com/tutorial/stl/iterators.html

于 2013-02-05T21:06:40.040 回答
2

vec.begin()并且vec.end()不返回vector. 它们实际上返回所谓的迭代器。迭代器的行为非常类似于指向元素的指针。如果你有一个i用 初始化的迭代器vec.begin(),你可以得到一个指向向量中第二个元素的指针i++——就像你有一个指向数组中第一个元素的点一样。同样,您可以i--向后退。对于某些迭代器(称为随机访问迭代器),您甚至可以i + 5i.

这就是算法访问容器的方式。它知道它应该排序的所有元素都在begin()和之间end()。它通过执行简单的迭代器操作来导航元素。然后它可以通过做来修改元素*i,这为算法提供了对i指向的元素的引用。例如,如果i设置为vec.begin(),而您这样做*i = 5;了,您将更改 的第一个元素的值vec

这种方法允许您仅传递要排序的 a 的一部分。vector假设您只想对vector. 你可以这样做:

std::sort(vec.begin(), vec.begin() + 5);

这是非常强大的。由于迭代器的行为与指针非常相似,因此您实际上也可以传递普通的旧指针。假设您有一个数组int array[] = {4, 3, 2, 5, 1};,您可以轻松调用std::sort(array, array + 5)(因为数组的名称将衰减为指向其第一个元素的指针)。

于 2013-02-05T21:07:05.097 回答
1

不必访问容器。这就是标准模板库(成为 C++ 标准库的一部分)背后的设计重点:算法对容器一无所知,只是迭代器。

这意味着他们可以使用任何提供一对迭代器的东西。当然,所有 STL 容器都提供begin()end()方法,但您也可以使用常规的旧 C 数组、MFC 或 glib 容器或其他任何东西,只需为其编写自己的迭代器即可。(对于 C 数组,它与 begin 和 end 迭代器一样简单aa+a_len

至于它在幕后是如何工作的:迭代器遵循一个隐式协议:你可以做一些事情,比如++it将迭代器推进到下一个元素,或者*it获取当前元素的值,或者*it = 3设置当前元素的值。(比这要复杂一点,因为有几种不同的协议——迭代器可以是随机访问或只进、常量或可写等。但这是基本思想。)所以,如果 `sort 被编码为限制它本身对迭代器协议(当然,它是),它适用于任何符合该协议的东西。

要了解更多,互联网上有很多教程(和书店);只有这么多的答案可以解释。

于 2013-02-05T21:07:27.113 回答
0

begin()end()返回迭代器。参见例如http://www.cprogramming.com/tutorial/stl/iterators.html

于 2013-02-05T21:06:49.277 回答
0

迭代器的作用类似于对容器一部分的引用。也就是说,*iter = z;实际上更改了容器中的元素之一。

std::sort实际上swap对包含的对象的引用使用了一个函数,因此您已经初始化的任何迭代器都保持相同的顺序,但这些迭代器引用的值会发生变化。

请注意,std::list它还具有称为sort. 它以相反的方式工作:您已经初始化的任何迭代器都保持相同的值,但这些迭代器的顺序会发生变化。

于 2013-02-05T21:10:59.753 回答