C++自定义vector类如何直接通过初始化列表赋值无需预先定义数组
C++自定义容器支持初始化列表赋值的实现方法
要支持{元素1, 元素2, ...}格式的花括号初始化列表构造与赋值,需要使用C++11标准引入的std::initializer_list类型,它专门用于接收花括号包裹的同类型元素集合,仅需要给类添加对应参数的构造函数和赋值运算符重载即可实现需求。
修改后的完整类实现
#include <initializer_list> #include <cstddef> #include <stdexcept> template <class T> class Test{ private: T* data = nullptr; // 存储元素的动态数组 size_t len = 0; // 存储当前元素个数 public: // 新增initializer_list构造函数,直接支持花括号初始化 Test(std::initializer_list<T> init_list) { len = init_list.size(); data = new T[len]; size_t idx = 0; // 遍历初始化列表的元素写入内部数组 for (const auto& item : init_list) { data[idx++] = item; } } // 可选:新增initializer_list版本的赋值运算符,支持后续直接用vect = {1,2,3}重赋值 Test& operator= (std::initializer_list<T> init_list) { // 先释放原有空间避免内存泄漏 delete[] data; len = init_list.size(); data = new T[len]; size_t idx = 0; for (const auto& item : init_list) { data[idx++] = item; } return *this; } // 补全原需求中的get方法 T get(size_t idx) const { if (idx >= len) throw std::out_of_range("索引越界"); return data[idx]; } // 析构函数释放动态申请的内存,避免泄漏 ~Test() { delete[] data; } };
测试效果
上述代码可直接运行你期望的调用逻辑:
#include <iostream> int main() { Test<int> vect = {0, 12, 23}; std::cout << vect.get(2) << '\n'; // 输出结果为23 // 也支持后续直接用初始化列表重新赋值 vect = {4,5,6}; std::cout << vect.get(1) << '\n'; // 输出结果为5 return 0; }
注意事项
- 需保证编译环境支持C++11及更高标准,当前主流编译器默认均已支持该特性
- 如果需要保留原有数组赋值的能力,不需要删除原有数组参数的
operator=重载,两种重载可共存,编译器会自动匹配参数对应的实现 - 上述示例仅为核心逻辑演示,若要完整模拟vector的功能,还需要补充拷贝构造、移动构造、迭代器、扩容逻辑等实现,避免出现内存泄漏或未定义行为
内容的提问来源于stack exchange,提问作者just a noob
相关产品推荐
相关产品推荐

