簡體   English   中英

從指針有條件地初始化 std::vector

[英]Conditionally initialize std::vector from pointer

我正在與一些 C++ 代碼交互,該代碼具有提供指針和 object 大小的方法(一些我無法更改的專有庫)。 界面看起來像這樣:

float *arrayPtr();
int arraySize();

我有一個 class 需要將其復制到向量中(以延長其壽命)。 在此指針不是 nullptr 的情況下,構造函數相當簡單(我需要復制數據以延長其生命周期):

struct A {
    std::vector<float> vec;
    A(float *ptr, int size) : vec( ptr, std::next(ptr, size) ) {}
}

但是,我有點不確定當ptrnullptr時如何最好地處理初始化。 我可以默認初始化,然后將所有內容移至構造函數主體,但這感覺效率很低:

A(float *ptr, int size) {
    if (ptr) {
        vec = std::vector<float>( ptr, std::next(ptr, size));
    }
}

還有其他選擇嗎?

ptrnullptr時,我希望將向量默認初始化為空向量。

編輯:

我突然想到我可能應該這樣做:

A(float *ptr, int size) : vec( ptr ? std::vector<float>(ptr, std::next(ptr, size)) : std::vector<float>() ) {}

但也許有更好的形式?

這不一定“更好”(實際上我認為您的原始代碼很好,因為向量的默認初始化實際上並沒有任何成本),但是當您需要為初始化程序執行一些邏輯時,您可以使用幫助程序 function:

struct A {
    std::vector<float> vec;
    A(float *ptr, int size) : vec( make_A_vector(ptr, size) ) {}

private:  
    static std::vector<float> make_A_vector(float const *begin, int size)
    {
        if ( size < 0 || (size > 0 && !begin) )
             throw std::runtime_error("invalid array length for A");

        if ( size == 0 )
             return {};

        return std::vector<float>(begin, begin + size);
   }
};

另一個常見的設計是讓您的 class 保持簡單,並在免費的 function 中完全具有構造邏輯:

struct A
{
    std::vector<float> vec;
};

inline A make_A(float const *ptr, int size)
{
     // sanity check omitted for brevity
     if ( size == 0 )
         return A{};

     return A{ std::vector<float>(ptr, ptr + size) };
}

這是一個基於經驗的判斷,關於什么是矯枉過正,什么是審美:)

研究std::nextstd::vector的 ctor 正在做什么。 你的第一次嘗試效果很好。 僅當您的size可靠地為0時,當您的指針為nullptr時。

std::next(it, n)

it - 基於 position 的迭代器。 ForwardIterator 應至少是一個前向迭代器。

n - 元素位置偏移的數量(默認為 1)。 這僅對隨機訪問和雙向迭代器是負面的。 difference_type 是表示 ForwardIterator 類型的迭代器之間距離的數值類型。

如果您放心,您的給定大小為0 ,當您獲得nullptr時, std::next返回與指針指向的相同 position 。

std::vector

你使用這個ctor:

使用范圍 [first, last) 的內容構造容器。

如果你的firstlast相同,你會得到一個空的std::vector 所以nullptr從來都不是問題。


不管這個發現。 你應該總是檢查nullptr的。 為了防御性編程 - 所有輸入都是邪惡的!


您提到過,您獲得的庫以容易出錯而聞名。 請省去很多麻煩,並檢查您從中獲得的每個參數的完整性。


一條評論是關於您擔心您的實施會比其他實施更差的評論。 在具有數千或數百萬次迭代的loop中檢查這些實現。 然后,如果它影響到你,你就可以做出預測。

暫無
暫無

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

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