Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c++;工作_C++_Sorting - Fatal编程技术网

C++ 如何在c++;工作

C++ 如何在c++;工作,c++,sorting,C++,Sorting,我是一名Java开发人员。我目前正在学习C++。我一直在看排序的代码示例。在Java中,通常会给排序方法一个它需要排序的容器,例如 sort(Object[] someArray) 我注意到C++中,你传递了两个ARG,容器的开始和结束。我的问题是,如何访问实际的容器 下面是取自维基百科的示例代码,演示了排序方法 #include <iostream> #include <algorithm> #include <vector> int main() {

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

sort(Object[] someArray)
我注意到C++中,你传递了两个ARG,容器的开始和结束。我的问题是,如何访问实际的容器

下面是取自维基百科的示例代码,演示了排序方法

#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] << ' ';
}
#包括
#包括
#包括
int main(){
std::vec;
矢量推回(10);矢量推回(5);矢量推回(100);
排序(vec.begin(),vec.end());
对于(int i=0;ivec.begin()
vec.end()
返回迭代器迭代器。迭代器是元素上的指针,可以使用迭代器读取和修改它们。这就是sort使用迭代器所做的

如果是迭代器,您可以直接修改迭代器引用的对象:

*it = X; 
排序函数不必知道容器,这是迭代器的强大功能。通过操纵指针,它可以对整个容器进行排序,甚至不知道它是什么容器

您应该了解迭代器()

begin()
end()
返回迭代器。例如,请参见
vec.begin()
vec.end()
不返回
向量的第一个和最后一个元素
。它们实际上返回一个迭代器。迭代器的行为非常类似于指向元素的指针。如果您有一个迭代器
i
,则使用
vec.begin()初始化该迭代器
,只需执行
i++
,您就可以获得指向向量中第二个元素的指针,这与数组中第一个元素的点相同。同样,您也可以执行
i--
以返回。对于某些迭代器(称为随机访问迭代器),您甚至可以执行
i+5
以获得
i
之后第5个元素的迭代器

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

此方法允许您只传递要排序的
向量的一部分。假设您只想对
向量的前5个元素进行排序。您可以执行以下操作:

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

< p>容器不必被访问。这是标准模板库(它成为C++标准库的一部分)后面的设计的全部要点:算法不知道容器的任何内容,只是迭代器。

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

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


要了解更多信息,internet(和书店)上有很多教程;答案只能解释这么多。

迭代器就像容器的一部分中的引用。也就是说,
*iter=z;
实际上更改了容器中的一个元素

std::sort
实际上在对所包含对象的引用上使用了一个
swap
函数,这样,您已经初始化的所有迭代器都保持相同的顺序,但迭代器引用的值会发生更改


请注意,<>代码> STD::清单< /C>也有成员函数叫做“代码>排序< /COD>”。它的工作原理是:已经初始化的任何迭代器都保持相同的值,但是迭代器的顺序会发生变化。

在C++中学习。它们将帮助你理解所有的东西。当然,它必须被“访问”。。询问者不理解的是如何访问它。@PedroLamarão:容器本身不被访问;只访问容器内的数据。这就是为什么你必须在
删除
后调用
擦除
。你对“访问”的解释不会帮助你与询问者沟通。@PedroLamarão:如果OP现在没有得到区分,他将有一个严重的误解,这将导致微妙的问题,直到它最终浮出水面,当他需要“擦除-删除”习语时,他必须了解他一直在犯的错误。最好从一开始就解释它。那就是实际上是有道理的。“因为数组的名称将衰减为指向其第一个元素的指针”,我认为