std::inplace_vector<T,N>::inplace_vector
来自cppreference.com
< cpp | container | inplace vector
constexpr inplace_vector() noexcept; |
(1) | (C++26 起) |
constexpr explicit inplace_vector( std::size_type count ); |
(2) | (C++26 起) |
constexpr inplace_vector( std::size_type count, const T& value ); |
(3) | (C++26 起) |
template< class InputIt > constexpr inplace_vector( InputIt first, InputIt last ); |
(4) | (C++26 起) |
template< container-compatible-range<T> R > constexpr inplace_vector( std::from_range_t, R&& rg ); |
(5) | (C++26 起) |
constexpr inplace_vector( const inplace_vector& other ); |
(6) | (C++26 起) |
constexpr inplace_vector( inplace_vector&& other ) noexcept(N == 0 || std::is_nothrow_move_constructible_v<T>); |
(7) | (C++26 起) |
constexpr inplace_vector( std::initializer_list<T> init ); |
(8) | (C++26 起) |
从多种数据来源构造新的 inplace_vector
。
1) 构造空的
inplace_vector
,其 data() == nullptr 且 size() == 0。3) 构造带有 count 个值为 value 的元素副本的
inplace_vector
。
T
必须向 inplace_vector
中Cpp17DefaultInsertable,否则,其行为未定义。4) 构造具有范围
[
first,
last)
的内容的 inplace_vector
。5) 构造具有范围 rg 的内容的
inplace_vector
。6) 复制构造函数。并且,如果 N > 0 且 std::is_trivially_copy_constructible_v<T> 为 true,则也是平凡复制构造函数。构造具有 other 的内容副本的
inplace_vector
。7) 移动构造函数。并且,如果 N > 0 且 std::is_trivially_move_constructible_v<T> 为 true,则也是平凡移动构造函数。使用移动语义构造具有 other 的内容的
inplace_vector
。8) 构造具有初始化式列表 init 的内容的
inplace_vector
。参数
count | - | 容器的大小 |
value | - | 用以初始化容器元素的值 |
first, last | - | 要从中复制元素的范围 [ first, last)
|
rg | - | 容器兼容范围,即元素可以转换为 T 的 input_range
|
other | - | 用以初始化容器元素的来源的另一个 inplace_vector
|
init | - | 用以初始化容器元素的初始化式列表 |
复杂度
1) 常数。
2,3) 与 count 成线性。
4) 与 std::distance(first, last) 成线性。
5) 与 std::ranges::distance(rg) 成线性。
6,7) 与 other 的大小成线性。
8) 与 init 的大小成线性。
异常
示例
运行此代码
#include <cassert> #include <initializer_list> #include <inplace_vector> #include <new> #include <print> #include <ranges> int main() { std::inplace_vector<int, 4> v1; // 重载 (1) assert(v1.size() == 0 && v1.capacity() == 4); std::inplace_vector<int, 0> v2; // 重载 (1),允许 N == 0 assert(v2.size() == 0 && v2.capacity() == 0); std::inplace_vector<int, 5> v3(3); // 重载 (2) assert(v3.size() == 3 && v3.capacity() == 5); std::println("v3 = {}", v3); try { std::inplace_vector<int, 3> v(4); // 重载 (2),count > N 时抛出 } catch(const std::bad_alloc& ex1) { std::println("ex1.what(): {}", ex1.what()); } std::inplace_vector<int, 5> v4(3, 8); // 重载 (3) assert(v4.size() == 3 && v4.capacity() == 5); std::println("v4 = {}", v4); try { std::inplace_vector<int, 3> v(4, 2); // 重载 (3),count > N 时抛出 } catch(const std::bad_alloc& ex2) { std::println("ex2.what(): {}", ex2.what()); } const auto init = {1, 2, 3}; std::inplace_vector<int, 4> v5(init.begin(), init.end()); // 重载 (4) assert(v5.size() == 3 && v5.capacity() == 4); std::println("v5 = {}", v5); std::inplace_vector<int, 4> v6(std::from_range, init); // 重载 (5) assert(v6.size() == 3 && v6.capacity() == 4); std::println("v6 = {}", v6); std::inplace_vector<int, 4> v7(v6); // 重载 (6) assert(v7.size() == 3 && v7.capacity() == 4); std::println("v7 = {}", v7); assert(v6.size() == 3); std::inplace_vector<int, 4> v8(std::move(v6)); // 重载 (7) // 注意,移动后 v6 处于有效但不确定的状态。 assert(v8.size() == 3 && v8.capacity() == 4); std::println("v8 = {}", v8); std::inplace_vector<int, 4> v9(init); // 重载 (8) assert(v9.size() == 3 && v9.capacity() == 4); std::println("v9 = {}", v9); try { std::inplace_vector<int, 2> v(init); // 重载 (8),init.size() > N 时抛出 } catch(const std::bad_alloc& ex3) { std::println("ex3.what(): {}", ex3.what()); } }
可能的输出:
v3 = [0, 0, 0] ex1.what(): std::bad_alloc v4 = [42, 42, 42] ex2.what(): std::bad_alloc v5 = [1, 2, 3] v6 = [1, 2, 3] v7 = [1, 2, 3] v8 = [1, 2, 3] v9 = [1, 2, 3] ex3.what(): std::bad_alloc
参阅
将值赋给容器 (公开成员函数) | |
[静态] |
返回当前存储空间能够容纳的元素数 (公开静态成员函数) |
直接访问底层连续存储 (公开成员函数) | |
返回元素数 (公开成员函数) | |
(C++17)(C++20) |
返回容器或数组的大小 (函数模板) |
(C++17) |
获得指向底层数组的指针 (函数模板) |