Neg*_*ero 9 c++ algorithm templates std
我试图使用clang编译以下代码但得到以下错误.
我想知道为什么sort从list课堂上使用会有效,但不是std::sort.
#include <list>
#include <iostream>
int main(){
std::string strings[] = {"hello", "nihao", "byebye", "yo"};
std::list<std::string> cars(strings, strings+sizeof(strings) / sizeof(char **));
// cars.sort(std::less<std::string>()); // compiles fine and produce a sorted list
std::sort(cars.rbegin(), cars.rend(), std::less<std::string>() ); // this one won't compile
for (std::list<std::string>::iterator it = cars.begin(); it != cars.end(); ++it)
std::cout << *it << " - ";
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
/usr/include/c++/4.2.1/bits/stl_iterator.h:320:25:错误:二进制表达式的操作数无效('iterator_type'(又名'std :: _ List_iterator>')和'iterator_type'){return __y .base() - __ x.base(); }
Ker*_* SB 13
std::sort需要随机访问迭代器,std::list但不提供.因此,std::list并std::forward_list实现自己的成员函数进行排序,使用较弱的迭代器进行排序.这些成员函数的复杂性保证比更有效的通用算法更复杂.[哎呀:见评论.]
此外,成员函数可以通过简单地重新链接列表节点来利用列表数据结构的特殊性质,而标准算法必须执行类似swap(或某种效果),这需要对象构造,赋值和删除.
注意这remove()是一个类似的情况:标准算法只是一些迭代器返回重新排列,而list成员函数一次执行查找和实际删除; 再次感谢能够利用列表内部结构的知识.