为什么std :: sort会更改对象的值?

Irb*_*bis -3 c++ stl c++11

一些代码,一个示例类:

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dis(1, 100);

class T
{
private:
   int x;
   int y;
public:
   T(): x(dis(gen)), y(dis(gen)) {}
   int getX() const { return x; }
   int getY() const { return y; }
};
Run Code Online (Sandbox Code Playgroud)

一个函数对象类:

class F
{
public:
   inline bool operator()(const T &a, const T &b) const
   {
      return (((a.getX() * a.getY()) > ( b.getX() * b.getY())) ? 1 : 0);
   }
};
Run Code Online (Sandbox Code Playgroud)

我创建了类T的对象,然后我尝试对它们进行排序:

std::vector<T> myVec(10);
T *p = new T[10];
F f;

for(int i = 0; i < 10; ++i)
{
    myVec.push_back(p[i]);
}
std::sort(myVec.begin(), myVec.end(), f);
Run Code Online (Sandbox Code Playgroud)

使用std :: sort对象后包含其他值(x,y).为什么std :: sort会更改对象的值?怎么了 ?

Vla*_*cow 7

首先,您创建了一个包含10个元素的向量

std::vector<T> myVec(10);
Run Code Online (Sandbox Code Playgroud)

然后,您向向量添加了10个新元素

for(int i = 0; i < 10; ++i)
{
    myVec.push_back(p[i]);
}
Run Code Online (Sandbox Code Playgroud)

现在矢量有20个元素.你对20个元素的这个向量进行了排序.

也许你的意思是以下

std::vector<T> myVec;
myVec.reserve( 10 );

//...
for(int i = 0; i < 10; ++i)
{
    myVec.push_back(p[i]);
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,`std :: vector <T> myVec(10);`本身的工作方式相同,不需要`p`. (3认同)