我的数据如下:
vector<pair<unsigned, pair<vector<unsigned>, vector<unsigned> > > > A;
5,((0,9),(1,2))
6, ((0),(8,9))
10,((1,10,15,16),(1,2))
2,((0,2,10),(8,9))
3,((0,1,2),(1,2))
1,((3,4,7),(1,2))
7,((3,4,6),(8,9))
11,((1,51,9,3,2,4,6),(8,9))
这样排序的输出显示为:
3,((0,1,2),(1,2))
5,((0,9),(1,2))
1,((3,4,7),(1,2))
10,((1,10,15,16),(1,2))
6, ((0),(8,9))
7,((3,4,6),(8,9))
2,((0,2,10),(8,9))
11,((1,51,9,3,2,4,6),(8,9))
那就是我想要按第二对矢量A排序。这样我就可以通过第二对矢量AEg的第二对矢量将元素组合在一起,这里我将所有包含(1,2)的元素组合在一起和(8,9)。然后我想根据以下(开始,结束)范围对第二对矢量A的第一对矢量进行排序。也就是说,其矢量位于(0,0)之间的元素出现在其矢量位于(0,1)之间的元素之前。例如。在示例中(0,1,2)出现在(0,9)之前,因为它的元素位于(0,2)之间,它出现在所述顺序中的(0,9)之前...类似于其他元素:
(Start,End)
(0,0),
(0,1),
(1,1),
(0,2),
(1,2),
(2,2),
(0,3),
(1,3),
(2,3),
(3,3),
(0,4),
(1,4),
(2,4),
(3,4),
(4,4),
(0,5),
(1,5),
(2,5),
(3,5),
(4,5),
(5,5),
(0,6),
(1,6),
(2,6),
(3,6),
(4,6),
(5,6),
(6,6),
(0,7),
(1,7),
(2,7),
(3,7),
(4,7),
(5,7),
(6,7),
(7,7),
(0,8),
(1,8),
(2,8),
(3,8),
(4,8),
(5,8),
(6,8),
(7,8),
(8,8),
.
.
(n,n)
我使用g ++运行C ++(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3。
我尝试通过以下方法解决这个问题:首先我将(1,2)和(8,9)之类的元素组合在一起。然后我将这些范围存储在另一个数据结构中。然后我迭代这些范围并尝试查看行是否落在所述范围内
答案 0 :(得分:2)
您可能拥有一个特别复杂的数据结构,其中包含您要在其上定义的超级特定和任意排序,但无论如何。 std::sort
的好处在于它完全适应:
std::sort(A.begin(), A.end(), MyComparator);
您需要写的只有:
typedef pair<unsigned, pair<vector<unsigned>, vector<unsigned> > > Elem;
bool MyComparator(const Elem& a, const Elem& b) {
// return true if a should go before b in the sort
// step 1 is apparently to do a vector comparison
for (size_t i = 0; i < a.second.second.size(); ++i) {
if (i == b.second.second.size()) {
return false;
}
else if (a[i] < b[i]) {
return true;
}
else if (a[i] > b[i]) {
return false;
}
}
if (a.second.second.size() < b.second.second.size()) {
return true;
}
// if we got here, the two vectors compare equal
// so onto the next steps 2, 3, ...
// etc.
}