2010-10-02 90 views
7

我試圖移植一些我大量使用System.arraycopy方法的Java代碼,並想知道在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 2010-10-02 03:13:57

+2

Preety確定theres一個std algoritm ...也許std ::複製? – Tom 2010-10-02 03:14:34

+0

@George:我想他是要求在C++中執行相當於'System.arraycopy()'的最佳方法,因爲OP剛剛開始使用C++並且沒有聽說過'std :: vector'。 – 2010-10-02 03:15:28

回答

5

給定a_len和b_len(包含a和b的字節長度)以及足夠大的dst緩衝區以容納兩個數組,您可以使用memcpy。注意:這也取決於dst被聲明爲指向字節大小數據的指針。

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

這非常適用於基本類型(因爲它看起來像你身邊複製字節數組)...如果你需要複製的對象,來看看的std ::複製<>()。

+5

std :: copy在原始類型上也能正常工作。 – 2010-10-02 03:19:39

+1

這也是我在查看的文檔中找不到的,可以使用memcpy()將某些東西放置在某個位置(memcpy(dst + a_len,...),謝謝 – Nolson 2010-10-02 04:22:57

+0

@Emile:只要「同樣如此」不包括性能,你是對的。對於基本類型,std :: copy會產生與memcpy相同的最終結果,但速度並不快。 – 2010-10-02 05:11:44

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和其他容器/算法是非常值得的。我推薦Josuttis的C++標準庫書。

vector::insert基本類型的載體可能會是一樣快,因爲在C數組做C風格memcpy。如果不是,我會很驚訝。

+0

啊,向量,非常感謝。我知道Java和C++之間並沒有「直接」的翻譯,因爲它們都是非常不同的語言。但是,當你不知道你真正想問什麼時,很難問'正確'的問題。所以,感謝您讓我在C++中以正確的方式開始工作。 – Nolson 2010-10-02 04:16:11

+0

沒問題。除了容器/迭代器/算法之外,要學習的最重要的「C++方法」是使用智能指針進行自動內存管理。來自Java(使用自動垃圾收集),你會真正感謝他們的用處。我保證,你花時間學習智能指針會節省10倍的時間,節省內存泄漏和懸掛指針錯誤。 – 2010-10-02 04:39:06

+0

有關智能指針的信息,請查看Boost庫:http://boost.org。特別是'shared_ptr'和'scoped_ptr'。 Boost庫類似於 「次要」標準C++庫,它具有許多整潔,通用的好東西。 – 2010-10-02 04:43:03