推 IhateOGC: :) 感謝 03/12 08:46
推 ilikekotomi: 感謝分享 之前沒注意過span 03/12 20:06
推 LPH66: cppreference 裡可以看到 span 是 C++20 的新東西 03/12 20:17
推 TitanEric: 感謝大大分享 原來有span可以用 03/13 01:06
推 mmmmei: 請問一下span跟其他container比起來有什麼特點嗎 03/13 12:05
std::span 不是容器喔! 它是做為連續記憶體的存取介面.
std::vector 和 std::span 的關係, 與 std::string 和
std::string_view 的關係很像, 只不過 std::string_view 是唯讀
的介面, 都有 non-owning 語意 (記憶體不是由他們管理, 是做為
附屬品而存在).
std::span 原本的名字是 std::array_view 不過委員會想將 view
後綴用來專指唯讀存取, 所以才將名稱改成現在這樣. 一般的情況
下, 類別如果想將私有 std::vector 資料成員分享出來, 在還沒有
std::span 的時代會這樣寫:
class Foo {
public:
// return data member 'values_'
std::vector<int>& values();
const std::vector<int>& values() const;
private:
std::vector<int> values_;
};
Foo foo;
foo.values().clear(); // surprise!
為了沿用 std::vector 本身的 range 特性, 幾乎把實作暴露出來
, 允許呼叫端直接變更狀態. 換成 std::span 不僅可達成相同效果
, 甚至還可以限制存取:
class Foo {
public:
std::span<int> values();
std::span<const int> values() const; // read only
private:
std::vector<int> values_;
};
Foo foo;
std::as_const(foo).values().front() = 99; // compile error
std::span 也可以用來作為和 C function 溝通的轉接器
參考資料
P0122: span: bounds-safe views for sequences of objects
https://bit.ly/2UBhVOO
N3851: Multidimensional bounds, index and array_view
https://bit.ly/2XT1DTi
※ 編輯: poyenc (150.116.41.131), 03/13/2019 23:44:44
推 mmmmei: 謝謝解釋 非常清楚 03/14 04:44
→ IhateOGC: 太神了!! 03/14 09:56