Ode*_*Ode -2 c++ pointers vector
有人告诉我应该避免在 C++ 中使用指针或 new,但我不知道如何操作。我用迭代器类实现了动态数组。这是代码:
自定义向量和迭代器:
#include <iostream>
template<class T> class Myvector{
private:
int size;
int capacity;
T* objects;
void add_capacity(){
int newCapacity = capacity * 2 +1;
T *newArray = new T[ newCapacity ];
for( int i = 0; i < size; ++i )
newArray[ i ] = std::move( objects[ i ] );
capacity = newCapacity;
std::swap( objects, newArray );
delete [ ] newArray;
}
public:
Myvector(){
objects = new T[1];
capacity = 1;
size = 0;
}
void add(T obj){
if (capacity == size){
add_capacity();
}
objects[size] = obj;
size += 1;
}
class Iterator
{
public:
T* operator->() { return ptr; }
Iterator(T *p) {
ptr= p;
}
Iterator operator++() {
++ptr;
return *this;
}
bool operator!=(const Iterator & other) const{return ptr != other.ptr;}
const T & operator*() const{return *ptr;}
private:
T * ptr; // Pointer to v.
};
Iterator begin() {
//return &objects[0];
return Iterator(&objects[0]);
}
Iterator end(){
//return &objects[size];
return Iterator(&objects[size]);
}
};
Run Code Online (Sandbox Code Playgroud)
所以问题是,是否可以在没有指针或新指针的情况下实现这一点?我想在 C++ 方面取得更好的成绩。
你听到的是真的。new您应该尽可能避免原始拥有指针。
只是不要错过最后一部分:“只要有可能”。原始拥有指针并new没有被完全禁止。它们是有其应用的工具。使用具有动态大小的数组不是其中之一。有std::vector。用它。
每当您认为需要使用new原始拥有指针时,您应该重新访问<memory>智能指针和容器库。很少在那里找不到您需要的东西。如果不这样做,您将使用第三方库而不是实现自己的容器。
但是,如果我们谈论重新实现std::vector(您通常不会这样做,但可以说您做了),那么情况就不同了。
如果你查看它的实现,std::vector你会发现它确实使用了原始指针。关键是原始指针的这种用法是被封装的。std::vector允许您访问指向底层数组的指针,但您永远不必担心调用delete该指针。
您MyVector无法管理其分配的数据的所有权。它没有析构函数,无法复制,并且存在更多问题。如果您确实编写了一个管理资源的类(可以是原始拥有指针,也可以是其他东西),您需要阅读3/5 规则。不过,您应该尽可能遵循 0 规则(位于链接文章的末尾)。
最后一个建议“更喜欢 0 规则”基本上就是类成员的“更喜欢容器和智能指针”。这两个“规则”都可以帮助您编写更简单的代码。平均错误较少的代码。您可以选择不遵循建议,但接下来您就得靠自己了。那么您必须注意正确管理资源。如果你不这样做,你就会遇到麻烦。