簡體   English   中英

如何在0(1)操作中將c ++向量轉換為lisp向量

[英]How would I convert a c++ vector to a lisp vector in a 0(1) operation

我有C ++ vector<int>這些C綁定,我已經用CFFI包裝了它。

我知道如何創建vector<int> s的std_carrayTovector和數據轉換回int與指針std_vectorToCArray這樣我就可以在Lisp中使用CFFI功能從中檢索數據MEM-AREF 我有正確的defcfun s為下面寫的。

我的問題是:如何將我的defcfun for std_vectorToCArray的輸出轉換為Lisp向量(例如#(1 2 3) )並使其成為O(1)操作 - 即同時復制所有數據。

vector_int* std_carrayTovector(int* a, size_t len) {
    vector<int>* v = new vector<int>;
    for(size_t i = 0; i < len; i++) 
        v->push_back(a[i]);
    return v;
}

int* std_vectorToCArray(vector_int* s) {
    return s->data();
}


(defcfun ("std_vectori_to_carray" %vector-int-to-c-array) :pointer 
  (s (:pointer vector-int)))

我沒試過這個,但我認為以下內容應該有效。 關於std::vector我們可以使用的重要一點是,它保證有一個誠實的上帝陣列支持。 也就是說, & my_vector [0]指向my_vector對象的my_vector (這不適用於例如std::list或其他任何東西,當然)

所以你要做的就是創建一個CFFI可以調用的函數(在你的C ++代碼中),它返回一個指向向量開頭的指針。 大概是這樣的:

extern "C"
Foo*
start_of_foo_vector (std::vector<Foo> vec)
{
    return & vec[0];
}

你需要一個extern "C"這樣你就不用擔心名字錯了。 當然,你必須為每種類型編寫不同的函數(並且不能使用帶有extern "C"模板,我不認為)。

在下次修改向量之前,您獲得的指針有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM