如何解决使用std :: sort时如何理解此结果?
我正在尝试实现PP
类。请首先帮助检查以下不完整的代码:
template <typename E>
class PP{
public:
struct Point2D {
static int used_count;
E _x;
E _y;
Point2D() : _x(0),_y(0) {
used_count++;
std::cout << "Point2D(),used_count = " << used_count << "\n";
}
virtual ~Point2D() {
used_count--;
std::cout << "~Point2D(),used_count = " << used_count << "\n";
}
};
std::vector<Point2D> _points;
int _size;
PP(int size) : _size(size) {
_points.resize(_size);
std::cout << "PP(int size)\n";
}
PP(E points[][2],int size)
: PP(size) { // Nx2 points
for (int i = 0; i < _size; i++) {
_points[i]._x = points[i][0];
_points[i]._y = points[i][1];
}
std::cout << "PP(E points[][2])\n";
}
virtual ~PP() {
std::cout << "~PP()\n";
}
void Print(const std::string& title) {
std::cout << title << "\n";
for (auto iter = _points.begin(); iter != _points.end(); iter++) {
const Point2D& p = *iter;
std::cout << p._x << "," << p._y << "\n";
}
}
void DoSort() {
std::sort(_points.begin(),_points.end(),[](const Point2D& l,const Point2D& r){
return (l._y > r._y) || (l._y == r._y && l._x > r._x);
});
}
};
template<> int PP<int>::Point2D::used_count = 0;
int main() {
int arr[][2] = {{1,2},{3,4},{5,1},{1,5},{2,8},{9,{6,6}};
int size = sizeof(arr) / sizeof(arr[0]);
if (1) {
PP<int> *t = new PP<int>(arr,size);
// test sort
{
t->Print("before sort");
t->DoSort();
t->Print("after sort");
}
delete t;
}
}
结果如下:
Point2D(),used_count = 1
Point2D(),used_count = 2
Point2D(),used_count = 3
Point2D(),used_count = 4
Point2D(),used_count = 5
Point2D(),used_count = 6
Point2D(),used_count = 7
Point2D(),used_count = 8
PP(int size)
PP(E points[][2])
before sort
1,2
3,4
5,1
1,5
2,8
9,1
6,6
~Point2D(),used_count = 7
~Point2D(),used_count = 6
~Point2D(),used_count = 5
~Point2D(),used_count = 4
~Point2D(),used_count = 3
~Point2D(),used_count = 2
~Point2D(),used_count = 1
after sort
2,8
5,6
1,5
6,4
3,4
1,2
9,1
5,1
~PP()
~Point2D(),used_count = 0
~Point2D(),used_count = -1
~Point2D(),used_count = -2
~Point2D(),used_count = -3
~Point2D(),used_count = -4
~Point2D(),used_count = -5
~Point2D(),used_count = -6
~Point2D(),used_count = -7
我的问题是,在DoSort
函数中,我只使用了reference
的{{1}},Point2D
的析构函数在{ {1}}例行程序?发生了什么?您能帮忙提些建议吗?预先感谢。
解决方法
您没有测量所调用的副本构造函数。您可以添加以下内容:
Point2D(Point2D const & p) : _x(p._x),_y(p._y) {
used_count++;
std::cout << "Point2D(),used_count = " << used_count << "\n";
}
如果这样做,您将获得预期的used_count
。
这里是demo。
当元素交换时,多余的副本在std::sort
的内部制作,其中有Point2D
的副本。
通常std::sort
会在其内部使用move函数,但是看到这些不必要的副本的原因是,您尚未为类定义move
。如果您这样做:
Point2D(Point2D&& p) : _x(p._x),_y(p._y) {
std::cout << "Point2D(),used_count = " << used_count << "\n";
used_count++;
}
Point2D& operator=(Point2D&&) = default;
您看到没有副本。但是,在对used_count
的调用中,std::sort
仍将在8到9之间振荡。仍然会创建相同数量的临时文件,但是通常将它们移动而不是复制,这样效率更高。对于这种特定的类实例,可能没有太大的改进,因为它仅包含2个int
,但这是一个很好的习惯。例如如果您将PP
实例化为std::string
,则可以大大提高效率。
这里是demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。