如何在c++中实现没有指针的动态数组?

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++ 方面取得更好的成绩。

for*_*818 7

你听到的是真的。new您应该尽可能避免原始拥有指针。

只是不要错过最后一部分:“只要有可能”。原始拥有指针并new没有被完全禁止。它们是有其应用的工具。使用具有动态大小的数组不是其中之一。有std::vector。用它。

每当您认为需要使用new原始拥有指针时,您应该重新访问<memory>智能指针和容器库。很少在那里找不到您需要的东西。如果不这样做,您将使用第三方库而不是实现自己的容器。


但是,如果我们谈论重新实现std::vector(您通常不会这样做,但可以说您做了),那么情况就不同了。

如果你查看它的实现,std::vector你会发现它确实使用了原始指针。关键是原始指针的这种用法是被封装的。std::vector允许您访问指向底层数组的指针,但您永远不必担心调用delete该指针。

MyVector无法管理其分配的数据的所有权。它没有析构函数,无法复制,并且存在更多问题。如果您确实编写了一个管理资源的类(可以是原始拥有指针,也可以是其他东西),您需要阅读3/5 规则。不过,您应该尽可能遵循 0 规则(位于链接文章的末尾)。

最后一个建议“更喜欢 0 规则”基本上就是类成员的“更喜欢容器和智能指针”。这两个“规则”都可以帮助您编写更简单的代码。平均错误较少的代码。您可以选择不遵循建议,但接下来您就得靠自己了。那么您必须注意正确管理资源。如果你不这样做,你就会遇到麻烦。