【问题标题】:Why does std::sort change values of the objects?为什么 std::sort 会改变对象的值?
【发布时间】:2014-05-11 15:05:43
【问题描述】:

首先是一些代码,一个示例类:

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 会改变对象的值?怎么了?

【问题讨论】:

  • 旁注:return (expr ? 1 : 0) 与布尔上下文中的 return expr 相同。
  • 你还没有在p上初始化你的数组......至少在你发布的代码中......
  • '为什么 std::sort 会改变对象的值?' 不打算这样做?!?它应该对值进行排序,而不是更改它们!!

标签: c++ c++11 stl


【解决方案1】:

一开始你创建了一个包含 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]);
}

【讨论】:

  • 谢谢,应该有 myVec[i] = p[i]。是的,我考虑过保留。
  • 更好的是,std::vector&lt;T&gt; myVec(10); 自身工作方式相同,不需要p
【解决方案2】:

您可以按照以下方式检查,但我的电脑没有显示任何错误。我正在使用 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");

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多