Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/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
为什么STL算法需要显式地使用两个迭代器? C++中的几个算法需要明确地指定两个迭代器。例如,使用std::sort(v.begin(),v.end())对std::vector v进行排序。由于处理整个容器(例如,使用std::sort,std::find等)是一种相当常见的情况,我想知道为什么没有实现只接受容器的这些算法的简单版本。我的意思是像std::sort(v),默认情况下使用v.begin()和v.end()迭代器_C++_User Interface_Stl - Fatal编程技术网

为什么STL算法需要显式地使用两个迭代器? C++中的几个算法需要明确地指定两个迭代器。例如,使用std::sort(v.begin(),v.end())对std::vector v进行排序。由于处理整个容器(例如,使用std::sort,std::find等)是一种相当常见的情况,我想知道为什么没有实现只接受容器的这些算法的简单版本。我的意思是像std::sort(v),默认情况下使用v.begin()和v.end()迭代器

为什么STL算法需要显式地使用两个迭代器? C++中的几个算法需要明确地指定两个迭代器。例如,使用std::sort(v.begin(),v.end())对std::vector v进行排序。由于处理整个容器(例如,使用std::sort,std::find等)是一种相当常见的情况,我想知道为什么没有实现只接受容器的这些算法的简单版本。我的意思是像std::sort(v),默认情况下使用v.begin()和v.end()迭代器,c++,user-interface,stl,C++,User Interface,Stl,是否有一些我不知道的潜在技术原因?先谢谢你 我想知道为什么没有实现只接受容器的这些算法的简单版本 在C++20中,它具有std::ranges版本 是否有一些我不知道的潜在技术原因 有点。当中的算法首次被提出时,区分模板中的不同情况是可能的,但这相当笨拙 您如何区分呼叫站点与这些模板中的哪一个相匹配 template <typename InIt, typename OutIt, typename Func> OutIt transform(InIt, InIt, OutIt, Fu

是否有一些我不知道的潜在技术原因?先谢谢你

我想知道为什么没有实现只接受容器的这些算法的简单版本

在C++20中,它具有
std::ranges
版本

是否有一些我不知道的潜在技术原因

有点。当
中的算法首次被提出时,区分模板中的不同情况是可能的,但这相当笨拙

您如何区分呼叫站点与这些模板中的哪一个相匹配

template <typename InIt, typename OutIt, typename Func>
OutIt transform(InIt, InIt, OutIt, Func); // unary transform on iterator

template <typename Lhs, typename Rhs, typename OutIt, typename Func>
OutIt transform(Lhs, Rhs, OutIt, Func); // binary transform on containers
模板
OutIt变换(InIt,InIt,OutIt,Func);//迭代器上的一元变换
模板
输出变换(左、右、输出、函数);//容器上的二进制变换

这是可能的,因为C++20具有以下范围:。迭代器的使用使函数具有更多容器的可移植性。如果您使用全功能迭代器创建自己的容器,它将自动与
std::sort
等函数一起工作。通过使用迭代器对,还可以将这些函数与指针(和数组)一起使用。迭代器不必与容器绑定。同样,根据迭代器的概念,也不可能获得
end()
来自
begin()
返回的迭代器,因此整个范围函数的语义不会与begin-end-one相同,例如
排序(容器)
排序(begin\u迭代器,end\u迭代器)
,前者不适用于数组\指针。也许原始STL的作者(莫罗佐夫)认为这种不一致令人困惑。ISO只是遵循了先前存在的library@Swift-星期五派?我不明白。
sort
的容器重载将被定义为“相当于
排序(开始(容器),结束(容器))
”。您现在可以这样做,但在设计一个可以理解的API时,您是否应该这样做,并且创建的代码对于不太熟悉每个重载的人来说是透明的?图书馆是在C++不规范的时候设计的,行为的大小也略有不同。STL中没有
std::begin
std::end
。数组
arr
上排序操作的数组版本将是
sort(arr,arr+数组的大小)
。它是否应该是C样式,
排序(arr,数组的大小)
?可以说,这些功能的设计是历史性的。范围库似乎是试图重写规则。
std::begin
std::end
是在ISO C++11中引入的,即使在那时,一些实现也没有为数组重载它们。顺便说一句,@Swift FridayPie数组的情况最容易区分<代码>排序(T(&arr)[N])将被定义为
排序(arr,arr+N)
。我不是说用户必须区分,我是说用C++98时代的工具编写重载,这样就不会有模棱两可的调用站点。