我有大约一百个 sorted 的集合vector<int>
虽然大多数向量中都有少量整数,但其中一些向量包含大量(> 10K)它们(因此向量不一定具有相同的大小)。
我想做的基本上是遍历所有这些排序向量中包含的从最小到最大的整数。
一种方法是将所有这些排序的向量合并到一个排序的向量中并简单地迭代。因此,
问题1:将排序向量合并为排序向量的最快方法是什么?
另一方面,我确信有更快/更聪明的方法来实现这一点,而无需合并和重新排序整个事情——也许从这个排序向量集合中迭代地弹出最小整数;没有先合并它们..所以:
问题 2:从一堆 sorted 中弹出最少元素的禁食/最佳方法是vector<int>
什么?
根据下面的回复,以及对问题的评论,我已经实现了一种方法,我为排序的向量创建了迭代器的优先级队列。我不确定这是否具有性能效率,但它似乎非常节省内存。我认为这个问题仍然悬而未决,因为我不确定我们是否已经建立了最快的方式。
// compare vector pointers by integers pointed
struct cmp_seeds {
bool operator () (const pair< vector<int>::iterator, vector<int>::iterator> p1, const pair< vector<int>::iterator, vector<int>::iterator> p2) const {
return *(p1.first) > *(p2.first);
}
};
int pq_heapsort_trial() {
/* Set up the Sorted Vectors */
int a1[] = { 2, 10, 100};
int a2[] = { 5, 15, 90, 200};
int a3[] = { 12 };
vector<int> v1 (a1, a1 + sizeof(a1) / sizeof(int));
vector<int> v2 (a2, a2 + sizeof(a2) / sizeof(int));
vector<int> v3 (a3, a3 + sizeof(a3) / sizeof(int));
vector< vector <int> * > sorted_vectors;
sorted_vectors.push_back(&v1);
sorted_vectors.push_back(&v2);
sorted_vectors.push_back(&v3);
/* the above simulates the "for" i have in my own code that gives me sorted vectors */
pair< vector<int>::iterator, vector<int>::iterator> c_lead;
cmp_seeds mycompare;
priority_queue< pair< vector<int>::iterator, vector<int>::iterator>, vector<pair< vector<int>::iterator, vector<int>::iterator> >, cmp_seeds> cluster_feeder(mycompare);
for (vector<vector <int> *>::iterator k = sorted_vectors.begin(); k != sorted_vectors.end(); ++k) {
cluster_feeder.push( make_pair( (*k)->begin(), (*k)->end() ));
}
while ( cluster_feeder.empty() != true) {
c_lead = cluster_feeder.top();
cluster_feeder.pop();
// sorted output
cout << *(c_lead.first) << endl;
c_lead.first++;
if (c_lead.first != c_lead.second) {
cluster_feeder.push(c_lead);
}
}
return 0;
}