-
Notifications
You must be signed in to change notification settings - Fork 63
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ex 13.31 为什么按字典升序添加的值使用sort也会调用swap #41
Comments
另外,我问的一直是c++primer的问题,我想问一下那个labels怎么添加的? |
但是如果将sort注释掉的话,不会输出swap语句 |
嗯,刚才说的不对,这里都是拷贝构造,不存在赋值的问题。 问题的关键是 std::sort 采用的算法,最典型的,如快排,显然即使已经排好序,也是需要 swap 操作的。 |
把输出语句加到赋值运算符里发现是调用了赋值运算符,不想纠结这个了,管他怎么实现. |
其实sort应该并不是用的swap,而是赋值操作,赋值操作符又调用了swap.如果假定std::sort是快排的话,进行赋值的操作应该是定义枢纽的时候了.不过赋值的话确实太常见了,也不奇怪了 |
@pezy 我的理解是,sort会调用operator<进行bool判断,如果为真,就会调用自定义的swap函数(如果定定义了HasPtr类型的<运算符),交换两个HasPtr的成员变量。这里operator=也是有调用的。所以,还是存在赋值运算符调用,应该是在sort内部。参见下代码:https://github.com/loveleon/My-Cpp-Primer/blob/master/ch13/ex13_31.cpp |
还是不要去想sort内部是怎么实现的了,因为根据数据量和分布用了大量不同的排序算法。
你看看这用了多少,这还是STL, 随便拿一个非标准的STL, 那实现的更是变态(基本上根据你实际传入的类型和迭代器类型各种型別判断),会有很多种处理分支。 所以,使用的时候也不要想那么多,接口定义传入啥,满足约束即可.
|
我自己定义的vector,加了几个元素,结果按顺序添加的元素(如"11","22")也会调用swap输出语句
vectorv1;
v1.emplace_back("11");
v1.emplace_back("22");
sort(v1.begin(),v1.end());
并且输出后发现顺序与添加进去的顺序并没有改变.swap用在哪里了?
The text was updated successfully, but these errors were encountered: