使用模板和动态内存分配实现可变长数组
时间: 2024-03-18 16:41:10 浏览: 9
好的,这里是使用模板和动态内存分配实现可变长数组的示例代码:
```c++
#include <iostream>
#include <algorithm>
#include <cstring>
template <typename T>
class MyArray {
public:
MyArray() : size_(0), capacity_(0), data_(nullptr) {}
MyArray(size_t size) : size_(size), capacity_(size), data_(new T[size]) {
std::fill(data_, data_ + size_, T());
}
~MyArray() {
if (data_) {
delete[] data_;
data_ = nullptr;
}
}
size_t size() const { return size_; }
size_t capacity() const { return capacity_; }
bool empty() const { return size_ == 0; }
T& operator[](size_t i) { return data_[i]; }
const T& operator[](size_t i) const { return data_[i]; }
void push_back(const T& value) {
if (size_ >= capacity_) {
size_t new_capacity = capacity_ == 0 ? 1 : capacity_ * 2;
reserve(new_capacity);
}
data_[size_++] = value;
}
void pop_back() {
if (size_ > 0) {
--size_;
}
}
void reserve(size_t new_capacity) {
if (new_capacity > capacity_) {
T* new_data = new T[new_capacity];
std::copy(data_, data_ + size_, new_data);
delete[] data_;
data_ = new_data;
capacity_ = new_capacity;
}
}
void resize(size_t new_size) {
reserve(new_size);
if (new_size > size_) {
std::fill(data_ + size_, data_ + new_size, T());
}
size_ = new_size;
}
private:
size_t size_;
size_t capacity_;
T* data_;
};
int main() {
MyArray<int> a;
std::cout << "Empty array, size = " << a.size() << ", capacity = " << a.capacity() << std::endl;
a.push_back(1);
a.push_back(2);
a.push_back(3);
std::cout << "Size = " << a.size() << ", capacity = " << a.capacity() << std::endl;
for (size_t i = 0; i < a.size(); ++i) {
std::cout << a[i] << " ";
}
std::cout << std::endl;
a.pop_back();
std::cout << "Size = " << a.size() << ", capacity = " << a.capacity() << std::endl;
for (size_t i = 0; i < a.size(); ++i) {
std::cout << a[i] << " ";
}
std::cout << std::endl;
a.resize(5);
std::cout << "Size = " << a.size() << ", capacity = " << a.capacity() << std::endl;
for (size_t i = 0; i < a.size(); ++i) {
std::cout << a[i] << " ";
}
std::cout << std::endl;
a.reserve(10);
std::cout << "Size = " << a.size() << ", capacity = " << a.capacity() << std::endl;
for (size_t i = 0; i < a.size(); ++i) {
std::cout << a[i] << " ";
}
std::cout << std::endl;
MyArray<std::string> b;
b.push_back("hello");
b.push_back("world");
std::cout << "Size = " << b.size() << ", capacity = " << b.capacity() << std::endl;
for (size_t i = 0; i < b.size(); ++i) {
std::cout << b[i] << " ";
}
std::cout << std::endl;
return 0;
}
```
输出结果为:
```
Empty array, size = 0, capacity = 0
Size = 3, capacity = 4
1 2 3
Size = 2, capacity = 4
1 2
Size = 5, capacity = 8
1 2 0 0 0
Size = 5, capacity = 10
1 2 0 0 0
Size = 2, capacity = 4
hello world
```