Я использую omniORB и C ++.
В моем приложении я получаю несколько небольших последовательностей CORBA из разных модулей, а затем мне нужно объединить их в одну большую последовательность для дальнейшей обработки.
Есть ли простой способ сделать это? Что-то вроде seq2.append(seq1)
или же seq2.push_back(seq1)
, Или некоторые операторы? (Я действительно новичок в STL-вещах).
Единственный способ, который я нашел, — это вручную просмотреть каждый элемент небольших последовательностей и добавить его в большую последовательность.
//idl
struct Device;
typedef sequence<Device> DevicesList;
//c++
icore::DevicesList full_list;
foreach (const DStatusList &stlist, states_) {
icore::DevicesList list = convertList(stlist);
int newlength = full_list.length() + list.length();
int last_index = full_list.length();
full_list.length(newlength);
int j=0;
for(int i=last_index; i< last_index+list.length(); i++,j++) {
full_list[i] = list[j];
}
}
Спасибо.
Это не так сложно сделать маленькие вспомогательные функции для таких вещей, как это. Например, вы можете сделать свой собственный push_back для последовательностей CORBA:
template<class Seq, class T>
void push_back(Seq& seq, const T& item)
{
const CORBA::ULong len = seq.length();
seq.length(len + 1);
seq[len] = item;
}
MySequence s;
push_back(s, 42);
Просто имейте в виду, что некоторые типы последовательностей ORB не перераспределяют память на push_back
(лайк std::vector
делает), так что это может вызвать перераспределение и копирование на каждом push_back()
вызов. Это может быть проблемой производительности. Вам нужно проверить, если ваш ORB делает это или нет, вероятно, посмотрев на источник, чтобы узнать, если это проблема. К сожалению, я думаю, что у omniORB есть эта проблема; по крайней мере, это было несколько лет назад.
Одним из способов смягчения этого является построение ваших последовательностей с максимальными значениями (если вы знаете это заранее). Это сделает одно большое выделение заранее, и вы можете позвонить push_back()
до этого максимума без запуска перераспределения:
MySequence s(100); // construct with maximum; allocation happens here
push_back(s, 42); // no reallocation
push_back(s, 0); // no reallocation
Я также согласен с советом Stefaanv в комментариях. Используйте последовательности CORBA как можно меньше. В основном используйте его «по краям» вашего приложения, где вам нужно делать / принимать вызовы CORBA. Получите данные в стандартные контейнеры, где ими будет легче манипулировать как можно скорее. Не позволяйте типам CORBA «просачиваться» в ваше приложение. Это также помогает сделать ваше приложение более переносимым, если вы когда-нибудь решите портировать его в среду, отличную от CORBA.
Я также слышал о новом отображении IDL в C ++ 11, которое предлагается. Это отобразит последовательности IDL прямо на std::vector
что сделает вещи значительно проще.
Других решений пока нет …