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

时间:2014-05-11 15:05:43

标签: c++ c++11 stl

一些代码,一个示例类:

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; }
};

函数对象类:

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

我创建了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);

使用std :: sort对象后包含其他值(x,y)。为什么std :: sort会更改对象的值?有什么问题?

2 个答案:

答案 0 :(得分:7)

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

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

然后你将10个新元素附加到向量

for(int i = 0; i < 10; ++i)
{
    myVec.push_back(p[i]);
}

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

也许你的意思是以下

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

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

答案 1 :(得分:0)

您可以按照以下方式检查,但我的电脑没有显示任何错误。我使用的是Visual Studio 2010。

#include <algorithm>
#include <string>
#include <vector>
#include <random>


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; }
};
class F
{
public:
   inline bool operator()(const T &a, const T &b) const
   {
      return (((a.getX() * a.getY()) > ( b.getX() * b.getY())) ? 1 : 0);
   }
};


int main()
{
    //freopen("output.txt","w",stdout);
    std::vector<T> myVec(10);
    T *p = new T[10];
    F f;

    for(int i = 0; i < 10; ++i)
    {
        myVec.push_back(p[i]);
    }

    //printf("Before sorting:\t");
    //for(int i = 0; i < myVec.size(); ++i)
    //  printf("%c(%d, %d [%d])",(i != 0 ? ',' : ' '), myVec[i].getX(), myVec[i].getY() , i);
    //printf("\n");

    std::vector< std::pair<int,int> > cache;
    for(int i = 0; i < myVec.size(); ++i)
        cache.push_back( std::make_pair( myVec[i].getX(), myVec[i].getY() ) );


    std::sort(myVec.begin(), myVec.end(), f);

    //printf("After sorting:\t");
    for(int i = 0; i < myVec.size(); ++i)
    {
        auto p = std::make_pair( myVec[i].getX(), myVec[i].getY() );
        auto t = std::find( std::begin(cache), std::end(cache), p);
        //int pos = std::distance( std::begin(cache), t);
        if ( t == std::end(cache) )
            printf("Error: Not found ( %d, %d ) pair\n", p.first, p.second);
        //printf("%c(%d, %d [%d])",(i != 0 ? ',' : ' '), p.first, p.second, pos );
    }
    //printf("\n");

}