К твоему первому вопросу (который быстрее): это зависит. Просто проверь это. Предполагая, что вы хотите получить конечный результат в векторе, альтернативы могут выглядеть примерно так:
#include <iostream>
#include <vector>
#include <queue>
#include <cstdlib>
#include <functional>
#include <algorithm>
#include <iterator>
#ifndef NUM
#define NUM 10
#endif
int main() {
std::srand(1038749);
std::vector<int> res;
#ifdef USE_VECTOR
for (int i = 0; i < NUM; ++i) {
res.push_back(std::rand());
}
std::sort(res.begin(), res.end(), std::greater<int>());
#else
std::priority_queue<int> q;
for (int i = 0; i < NUM; ++i) {
q.push(std::rand());
}
res.resize(q.size());
for (int i = 0; i < NUM; ++i) {
res[i] = q.top();
q.pop();
}
#endif
#if NUM <= 10
std::copy(res.begin(), res.end(), std::ostream_iterator<int>(std::cout,"\n"));
#endif
}
$ g++ sortspeed.cpp -o sortspeed -DNUM=10000000 && time ./sortspeed
real 0m20.719s
user 0m20.561s
sys 0m0.077s
$ g++ sortspeed.cpp -o sortspeed -DUSE_VECTOR -DNUM=10000000 && time ./sortspeed
real 0m5.828s
user 0m5.733s
sys 0m0.108s
Итак, std::sort
бьет std::priority_queue
, в этом случае . Но, может быть, у вас лучше или хуже std:sort
, а может, у вас лучше или хуже реализация кучи. Или, если не лучше или хуже, просто более или менее подходит для вашего точного использования, которое отличается от моего изобретенного использования: «создать отсортированный вектор, содержащий значения».
Я могу с большой уверенностью сказать, что случайные данные не попадут в наихудший случай std::sort
, поэтому в некотором смысле этот тест может быть лестным. Но для хорошей реализации std::sort
ее наихудший случай будет очень трудно построить, и в любом случае он может и не быть таким уж плохим.
Редактировать: я добавил использование мультимножества, так как некоторые люди предложили дерево:
#elif defined(USE_SET)
std::multiset<int,std::greater<int> > s;
for (int i = 0; i < NUM; ++i) {
s.insert(std::rand());
}
res.resize(s.size());
int j = 0;
for (std::multiset<int>::iterator i = s.begin(); i != s.end(); ++i, ++j) {
res[j] = *i;
}
#else
$ g++ sortspeed.cpp -o sortspeed -DUSE_SET -DNUM=10000000 && time ./sortspeed
real 0m26.656s
user 0m26.530s
sys 0m0.062s
На ваш второй вопрос (сложность): все они O (n log n), игнорируя с трудом детали реализации, такие как выделение памяти O (1) или нет (vector::push_back
и другие формы вставки в конце амортизируются O (1)), и предполагается, что под «сортировкой» подразумевается сортировка сравнения. Другие виды сортировки могут иметь меньшую сложность.
Существует множество возможностей интеграции, но, прежде чем исследовать их, на вашем месте я бы еще раз рассмотрел сам вопрос.
В исключительном случае введение нового языка в устоявшийся проект. Желания, эстетические предпочтения или навыки одного разработчика не являются достаточным оправданием для этого. Внедрение нового языка в проект должно быть стратегическим решением для проекта, а не задним ходом.
Если вы все же решите расширить основные языки, используемые для разработки системы,
Думайте о формате данных как о связанном с механизмом интеграции, но в идеале независимо от него. Я имею в виду: вы можете использовать XML-документ для интеграции, независимо от того, хранится ли он в базе данных или отправляется через интерфейс REST, или хранится в файловой системе, или помещается / помещается в очередь. Вы также можете использовать файл с разделителями-запятыми для любого из этих механизмов.
Oracle, MSMQ, MQSeries и так далее. Даже файловая система может быть точкой интеграции.Думайте о формате данных как о связанном с механизмом интеграции, но в идеале независимо от него. Я имею в виду: вы можете использовать XML-документ для интеграции, независимо от того, хранится ли он в базе данных или отправляется через интерфейс REST, или хранится в файловой системе, или помещается / помещается в очередь. Вы также можете использовать файл с разделителями-запятыми для любого из этих механизмов.
Oracle, MSMQ, MQSeries и так далее. Даже файловая система может быть точкой интеграции.Думайте о формате данных как о связанном с механизмом интеграции, но в идеале независимо от него. Я имею в виду: вы можете использовать XML-документ для интеграции, независимо от того, хранится ли он в базе данных или отправляется через интерфейс REST, или хранится в файловой системе, или помещается / помещается в очередь. Вы также можете использовать файл с разделителями-запятыми для любого из этих механизмов.
Вы также можете использовать файл с разделителями-запятыми для любого из этих механизмов. Вы также можете использовать файл с разделителями-запятыми для любого из этих механизмов.Потенциально они могли выставить сервисный слой через мыло или что-то попроще? Кроме того, вы всегда можете работать с одной и той же базой данных на разных языках, однако, если большая часть логики не находится в хранимых процедурах (не обязательно рекомендуя этот подход), вы получите повторяющийся код.
Не совсем. Java использует CORBA для взаимодействия, а VB использует COM для взаимодействия. Возможно, вы сможете построить мост, используя JNI , но я понимаю, что это может быть довольно сложной задачей.
Вы можете соединить эти два соединения, используя адаптер C / C ++ для сопоставления вызовов JNI с COM. Но это было бы ужасно . Я надеюсь, что есть лучшее решение, но я понимаю, что интегрировать код .NET и Java довольно сложно, поскольку у обоих поставщиков (Sun и Microsoft) нет никаких стимулов для оптимизации такого рода разработки.
Я этого не делал. Думаю, у вас есть следующие варианты: