一些代码,一个示例类:
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会更改对象的值?有什么问题?
答案 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");
}