- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下数据结构:
std::vector<std::vector<std::pair <std::vector<unsigned>,std::vector<unsigned> >, unsigned > > A;
包含以下数据:
((7),(108,109)),5
((7),(108,109)),4
((7),(101,102,110)),3
((7),(101,102)),1
((7),(51)),2
((7),(51,54)),6
((7),(40,54,59)),7
((3),(108,109)),15
((3),(101,102,110)),13
((3),(101,102)),11
((3),(51)),12
((3),(51,54)),16
((3),(40,54,59)),17
((9),(108,109)),25
((9),(108,109)),24
((9),(108,109,110)),20
((9),(101,102,110)),23
((9),(111,112,120)),21
((9),(101,102)),29
((9),(51)),22
((9),(51,54)),26
((9),(40,54,59)),7
((8,2,10),(108,109)),25
((8,2,10),(108,109)),24
((8,2,10),(108,109,110)),20
((8,2,10),(101,102,110)),23
((8,2,10),(111,112,120)),21
((8,2,10),(101,102)),29
((8,2,10),(51)),22
((8,2,10),(51,54)),26
((8,2,10),(40,54,59)),7
((5,7),(108,109)),35
((5,7),(108,109)),34
((5,7),(108,109,110)),30
((5,7),(101,102,110)),33
((5,7),(111,112,120)),31
((5,7),(101,102)),39
((5,7),(51)),32
((5,7),(51,54)),36
((5,7),(40,54,59)),37
现在我想按以下方式安排我的数据:
((3),(101,102)),11
((3),(108,109)),15
((3),(101,102,110)),13
((7),(101,102)),1
((7),(108,109)),5
((7),(108,109)),4
((7),(101,102,110)),3
((9),(101,102)),29
((9),(108,109)),25
((9),(108,109)),24
((9),(101,102,110)),23
((9),(108,109,110)),20
((9),(111,112,120)),21
((5,7),(101,102)),39
((5,7),(108,109)),35
((5,7),(108,109)),34
((5,7),(101,102,110)),33
((5,7),(108,109,110)),30
((5,7),(111,112,120)),31
((8,2,10),(101,102)),29
((8,2,10),(108,109)),25
((8,2,10),(108,109)),24
((8,2,10),(101,102,110)),23
((8,2,10),(108,109,110)),20
((8,2,10),(111,112,120)),21
((3),(51)),12
((3),(51,54)),16
((3),(40,54,59)),17
((7),(51)),2
((7),(51,54)),6
((7),(40,54,59)),7
((9),(51)),22
((9),(51,54)),26
((9),(40,54,59)),7
((5,7),(51)),32
((5,7),(51,54)),36
((5,7),(40,54,59)),37
((8,2,10),(51)),22
((8,2,10),(51,54)),26
((8,2,10),(40,54,59)),7
排序是通过首先按大小对 pair<> 中第一个 pair<> 的第一个 vector 进行排序来实现的。然后按字典顺序对 vector 进行排序。 pair<> 中第二对的第二个 vector 也是先按 size 的大小排序,然后再按字典顺序排序。数据作为一个整体根据 vector A 的 pair<> 中第一对 <> 的第二个 vector 进行聚类。即用户指定根据以下条件将 A 的所有元素聚类在一起:((101,102),(108,109) ,(101,102,110),(108,109,110),(111,112,120)) 和 ((51),(51,54),(40,54,59)).
我知道可以按 (i) 排序。第一尺寸和(ii)。然后按字典顺序对 vector 进行排序。通过使用以下代码:
bool mySort(const pair<vector<unsigned>,vector<unsigned> > &a , const pair<vector<unsigned>,vector<unsigned> > &b)
{
if (a.first.size() == b.first.size()) {
//If sizes of the vectors are equal
//Sort the graph lexicographically.
return std::lexicographical_compare(a.first.begin(),a.first.end(),b.first.begin(),b.first.end());pair<vector<unsigned>,vector<unsigned> > a
} else {
//Sort by size.
return a.first.size() < b.first.size();
}
}
int main()
{
std::vector<std::pair<std::vector<unsigned>,std::vector<unsigned> > > a;
std::sort(a.begin(),a.end(),mySort);
}
但我不明白如何在排序时将 A 的第一对 vector 中的第二个 vector 聚集在一起((i)。按大小(ii)。然后按字典序排序)。有人可以帮助我吗。
此外,我拥有的 vector A 的大小非常大。因此,任何高效的解决方案都将是锦上添花。
我使用的gcc版本是:gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
如果可以使用任何数据结构在 c 或 c++ 中实现相同的功能,我觉得很好(因为我只对我指定的特定顺序感兴趣)。
编辑:生成输入的代码:
std::vector<std::pair<std::vector<unsigned>, std::vector<unsigned> > > a;
vector<unsigned> b; vector<unsigned> p;
b.push_back(7); p.push_back(108); p.push_back(109);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(101); p.push_back(102); p.push_back(110);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(101); p.push_back(102);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(51);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(51); p.push_back(54);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(40); p.push_back(54); p.push_back(59);
a.push_back(make_pair(b,p));
b.clear(); p.clear();
b.push_back(3);
p.push_back(108); p.push_back(109);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(101); p.push_back(102); p.push_back(110);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(101); p.push_back(102);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(51);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(51); p.push_back(54);
a.push_back(make_pair(b,p));
p.clear();
p.push_back(40); p.push_back(54); p.push_back(59);
a.push_back(make_pair(b,p));
最佳答案
您可以先进行分区 (std::partition
),然后对每个“簇”进行排序 (std::sort
)。
以下内容可能会有所帮助:
using vec_pair = std::pair<std::vector<unsigned>, std::vector<unsigned>>;
std::set<std::vector<unsigned>> wanted = {
{101,102}, {108,109}, {101,102,110}, {108,109,110}, {111,112,120}};
auto mid = std::partition(a.begin(), a.end(), [&](const vec_pair& p){
return wanted.count(p.second) != 0;
});
std::sort(a.begin(), mid, mySort); // First cluster
std::sort(mid, a.end(), mySort); // Second cluster
在 C++03 中,lambda 可以被这个仿函数代替:
struct allowed
{
public:
explicit allowed(const std::set<std::vector<unsigned>>& wanted) : wanted(wanted) {}
bool operator () (const vec_pair& p) const {
return wanted.count(p.second) != 0;
}
private:
const std::set<std::vector<unsigned>>& wanted;
};
代码变为:
std::vector<vec_pair>::iterator mid = std::partition(a.begin(), a.end(), allowed(wanted));
关于c++ - 对数组或 vector 进行排序和聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28757286/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!