怎样对多个vector按同样的方式排序?
比如有3个vector,第一个的内容为:3,2,4,5,1
第二个的内容为:c,d,b,a,e
第三个的内容为:C,E,D,B,A
我想对第一个进行排序,并把第二个和第三个按照第一个移动元素的相同的方式移动元素,也就是:
第一个变成1,2,3,4,5
第二个变成e,d,c,b,a
第三个变成A,E,C,D,B
定义结构
struct s
{
int i;
char c1;
char c2;
};
然后:
vector <s> vs;
...
对vs排序可以实现,但太麻烦。有没有简单的方式,比如只使用stl算法?
[解决办法]
stl现成算法没有这个功能。
[解决办法]
使用stl的算法库的sort函数,写个仿函数,用具有仿函数版本的sort算法
[解决办法]
SORT()排序。你看一下C++STL程序员开发指南。里面介绍的很详细
[解决办法]
如果第一个向量包含的是不间断自然数的话(就你所举的例子那样1..5)
重排其它向量时根本无需使用sort(),第一个向量的各元素值已经表示出新向量各元素的值了!
s1={3,2,4,5,1}
s2={c,d,b,a,e}
new_s2={s2[s1[1]],s2[s1[2]],s2[s1[3]],s2[s1[4]],s2[s1[5]]}
[解决办法]
最简单的方法是修改你的设计。坚持一个错误的决定是免不了要麻烦的。
[解决办法]
stl中sort模板有两个版本:
template <class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class StrictWeakOrdering>
void sort(RandomAccessIterator first, RandomAccessIterator last,
StrictWeakOrdering comp);
其中第二个版本可以自己定义一个关系比较函数对象来确定如何排序。
比如按升序排序,只要从stl中less_equal模板派生一个新类,重定义其中的operator()函数
class le: public less_equal <s> {
public:
bool operator()(const s& x, const s& y)
{ return x.i <= y.i; }
};
然后就可以这样排序
sort(vs.begin(), vs.end(), le());
[解决办法]
gfxiang(afu) 的做法还是和不错的。
如果修改一下设计应该会更好的。
[解决办法]
自己设计一个函数对象可以不啊,各位不要见笑哈