C++ STL-max\u元素的复杂性

C++ STL-max\u元素的复杂性,c++,stl,complexity-theory,C++,Stl,Complexity Theory,因此,根据这里的链接:,max\u元素函数是O(n),显然适用于所有STL容器。这是正确的吗?一个集合(实现为二叉树)不应该是O(logn)吗 与此相关的是,我总是使用cplusplus.com来回答更容易回答的问题,但我想知道其他人对该网站的看法。它是线性的,因为它涉及到每一个元素 使用相同的比较器在集合或其他有序容器上使用它是毫无意义的,因为您可以在恒定时间内使用.rbegin() 如果不使用相同的比较函数,则无法保证顺序一致,因此,它必须接触每个元素,并且至少必须是线性的 尽管算法可能针对

因此,根据这里的链接:,
max\u元素
函数是O(n),显然适用于所有STL容器。这是正确的吗?一个集合(实现为二叉树)不应该是O(logn)吗


与此相关的是,我总是使用cplusplus.com来回答更容易回答的问题,但我想知道其他人对该网站的看法。

它是线性的,因为它涉及到每一个元素

使用相同的比较器在集合或其他有序容器上使用它是毫无意义的,因为您可以在恒定时间内使用
.rbegin()

如果不使用相同的比较函数,则无法保证顺序一致,因此,它必须接触每个元素,并且至少必须是线性的

尽管算法可能针对不同的迭代器类别进行专门化,但无法根据迭代器范围是否有序来专门化它们


大多数算法适用于无序范围(
max\u element
包括在内),少数算法要求对范围进行排序(例如
set\u union
set\u intersection
),有些算法要求该范围具有其他属性(例如
推送堆
pop\u堆
),所以它对容器一无所知。因此,这种线性搜索是在前向迭代器上进行的最佳搜索

对于所有STL容器,max_元素函数为O(n)

这是不正确的,因为
max\u元素
适用于迭代器,而不是容器。如果给它一个集合中的迭代器,它无法知道它们来自集合,因此将遍历所有迭代器以寻找最大值。所以正确的句子是:

对于所有前向迭代器,max_元素函数都是O(n)


此外,如果您知道您正在操作一个集合,那么您已经可以访问比O(n)更快地生成max元素的方法,那么为什么要使用
max\u元素

STL算法不知道从哪个容器获取迭代器,它是否是有序的,以及使用了什么顺序约束。这是一种线性算法,它检查范围内的所有元素,同时跟踪到目前为止看到的最大值

请注意,即使您可以使用元编程技术来检测迭代器从中获得的容器类型,也不能保证您可以直接跳到最后一个元素以获得最大值:

int values[] = { 1, 2, 3, 4, 5 };
std::set<int, greater<int> > the_set( values, values+5 );
std::max_element( the_set.begin(), the_set.end() ); //??
int值[]={1,2,3,4,5};
std::设置_集(值,值+5);
std::max_元素(_set.begin(),_set.end());/??

即使迭代器来自一个集合,它也不是最后一个元素,而是第一个元素,即保持最大值的元素。使用更复杂的数据类型,可以用一些与MI/max值无关的键来排序。

CPLUS PLUS是我在大C++项目中的主页:所有关于Max元素的信息等都在这里。O(N-1)那么rbegin()保证指向max元素?此外,使用反向迭代器会从最大值到最小值遍历集合吗?编辑:我自己搜索了一下,发现这是最重要的case@sas4740:对于
std::set
或其他正确的有序容器,因为元素的存储顺序是递增的。(默认的比较器是
std::less
;如果您使用不同的比较器,“增加”可能不是一种有意义的描述方式。)
反向迭代器总是以相反的顺序进行,因此;由于集合的顺序是递增的,所以反向迭代器的顺序是递减的。