2010-10-02 4 views
7

Я пытаюсь перенести некоторый Java-код, который сильно использует метод System.arraycopy и хочет знать, есть ли эквивалент в C++. В основном я хочу иметь n байтовых массивов и объединить их в один большой массив. Каждый из исходных массивов может иметь переменную длину, поэтому я не хочу проходить через обручи вычисления длины концевых массивов, а затем заполнять весь массив по одной позиции за раз, поскольку это кажется довольно медленным, и я уверен, что это оптимизирована работа. Однако я не могу найти, что такое оптимизация (хотя я могу сделать это более сложным, чем это должно быть).C++ эквивалент Java System.arraycopy

Вот некоторый код псевдо (Java), чтобы проиллюстрировать, что я хочу делать.

byte[] a = new byte[]{0x00, 0x01, 0x02}; 
byte[] b = new byte[][0x03, 0x04, 0x05]; 
byte[] ab = new byte[a.length+b.length]; 
System.arraycopy(ab, 0, a, 0, a.length); 
System.arraycopy(ab, a.length+1, b, 0, b.length); 
//Now, I would expect ab to look like {0x00, 0x01, 0x02, 0x03, 0x04, 0x05} 

Как я уже сказал, это может быть просто в C++, но я буду делать это много, много раз, и хотите, чтобы убедиться, что я делаю это настолько эффективно, насколько это возможно.

+2

Есть ли причина, по которой вы не можете хранить свои данные в стандартном векторном библиотеке шаблонов вместо того, чтобы возиться с массивами? – George

+2

Preety sure theres std algoritm ... может быть, std :: copy? – Tom

+0

@George: Я думаю, он спрашивает, что лучший способ сделать эквивалент 'System.arraycopy()' в C++, поскольку OP только что начал с C++ и не слышал о 'std :: vector'. –

ответ

5

Приведенные a_len и b_len (содержащие длину в байтах a и b) и dst-буфер, достаточно большой для хранения обоих массивов, вы можете использовать memcpy. Примечание: это также зависит от того, объявлен ли dst как указатель на данные размера байта.

memcpy(dst, a, a_len); 
memcpy(dst+a_len, b, b_len); 

Это хорошо работает для примитивных типов (как это выглядит, как вы копируете байтовые массивы вокруг) ... Если вам нужно скопировать объекты, посмотрите на станд :: скопировать <>().

+5

std :: copy будет работать также и на примитивных типах. –

+1

Это было то, чего я не мог найти в документации, на которую я смотрел, на том, что вы можете использовать memcpy() для размещения чего-то в определенном месте (memcpy (dst + a_len, ...). Спасибо. – Nolson

+0

@Emile: до тех пор, пока «точно так же» не включает производительность, вы правы. Для примитивных типов «std :: copy» даст тот же конечный результат, что и «memcpy», но не так быстро. –

1

Попробуйте это:

#include <vector> 

int main() 
{ 
    typedef unsigned char Byte; 
    std::vector<Byte> a; 
    std::vector<Byte> b; 
    // Fill vectors a and b 

    std::vector<Byte> ab; 
    // Reserve enough memory to fit a and b in order to avoid 
    // unnecessary reallocations. 
    ab.reserve(a.size() + b.size()); 
    ab.insert(ab.end(), a.begin(), a.end()); 
    ab.insert(ab.end(), b.begin(), b.end()); 

    return 0; 
} 

В C++, std::vector Ваш дружественный район динамически повторно значительный массив. Это так же быстро, как и обычные массивы для случайного доступа. Хорошо стоит изучить std::vector и другие контейнеры/алгоритмы в стандартной библиотеке. Я рекомендую стандартную библиотечную книгу C++ от Josuttis.

vector::insert на векторах основных типов, вероятно, будет так же быстро, как и C-стиль memcpy на массивах C. Я был бы очень удивлен, если бы не так.

+0

А, векторы, большое спасибо. Я знаю, что между Java и C++ нет «прямого» перевода, поскольку они оба очень разные языки. Но трудно задавать «правильный» вопрос, когда вы не знаете, что вы действительно спрашиваете. Так что спасибо, что запустили меня по пути правильного пути, чтобы делать что-то на C++. – Nolson

+0

Нет проблем. Помимо контейнеров/итераторов/алгоритмов, наиболее важной задачей «C++ way» для изучения было бы автоматическое управление памятью с помощью интеллектуальных указателей. Исходя из Java (с его автоматической сборкой мусора), вы действительно оцените их полезность. Я гарантирую, что время, затрачиваемое на использование ориентированных умных указателей, будет платить за себя 10-кратное время, сохраненное в погоне за утечками памяти и оборванными ошибками указателя. –

+0

Информацию об интеллектуальных указателях можно найти в библиотеке Boost: http://boost.org. В частности, 'shared_ptr' и' scoped_ptr'. Библиотека Boost похожа на стандартную библиотеку C++ с множеством опрятных универсальных лакомств. –

Смежные вопросы