试图制作一个矢量库?但卡在=运算符的重载中

trying to make a vector library ? But stuck in overloading of = operator

提问人:satej dhakane 提问时间:6/15/2023 更新时间:6/15/2023 访问量:77

问:

我正在尝试构建向量库。代码如下所示

#include <iostream>
#include <string>

namespace std
{
   template<typename T>
   class vector
   {
      private:
      T* value;
      T* temp;
      int arraySize{1};

      public:
      vector()
      {
        value=NULL;
        temp=NULL;
      }

      int size()
      {
          return arraySize;
      }

      void push(T val)
      {
        if(value==NULL)
        {
          value=new T[arraySize];
          value[arraySize-1]=val;
        }
        else if(value!=NULL)
        {
          arraySize=arraySize+1;
          temp=new T[arraySize];
          int lastIndex=arraySize-1;
          for(int j=0;j<lastIndex;j++)
            {
              temp[j]=value[j];
            }
          temp[lastIndex]=val;
          delete[] value;
          value=temp;
          temp=NULL;
        }
      }

      T pop()
      {
        int popIndex=arraySize-1;
        T t = value[popIndex];
        arraySize=arraySize-1;
        if(arraySize>=0)
        {
          temp=new T[arraySize];
          for(int j=0;j<popIndex;j++)
            {
              temp[j]=value[j];
            }
          delete[] value;
          value=temp;
          temp=NULL;
          return t;
        }
        else if(arraySize<0)
        {
          std::cout<<"Memory underflow\n";  
          reset();
        }
      }

      T operator[](int index)const
      {
        return value[index];  
      }

      T front()const
      {
          return (value[arraySize-1]);
      }

      T back()const
      {
          return (value[0]);
      }

      private:
      void reset()
      {
        arraySize=1;
        vector();
      }
   };
}

int main() 
{
  std::vector<std::string> v;

  v.push("1");
  v.push("2");
  v.push("3");

  std::cout<<"the element is : "<<v[1]<<"\n";

  std::cout<<"front element is : "<<v.front()<<"\nback(last) element is : "<<v.back()<<"\n";

  std::cout<<"size : "<<v.size()<<"\n";
  std::cout<<v.pop()<<"\n";
  std::cout<<v.pop()<<"\n";
  std::cout<<"size : "<<v.size()<<"\n";

  v.push("4");

  std::cout<<"size : "<<v.size()<<"\n";
  std::cout<<v.pop()<<"\n";
  std::cout<<"size : "<<v.size()<<"\n";
}

我已经为 v[1] 重载了这个 [] 运算符,但我想这样写,例如
v[2]="2";

我应该怎么做 请帮忙 .如果要完成,请建议对代码进行一些更改

我试图寻找 = 运算符的重载,但它告诉你只能接受一个参数

C++ stdvector 赋值运 算符

评论

4赞 Eljay 6/15/2023
怎么样 ?T& operator[](int index) { return value[index]; }
9赞 463035818_is_not_an_ai 6/15/2023
您不应该将内容添加到命名空间中。即使不直接包含其他标头,也可能包含,或者可能具有转发声明。只要成功,一切都会好起来的stdvectormy::vector
0赞 Pepijn Kramer 6/15/2023
只是好奇为什么你把数组大小初始化为 1?这可能会让你以后陷入逐个错误。使用 std::size(无符号类型)维护大小也更习惯,这样您就不会意外地使用负大小的数据。
4赞 BoP 6/15/2023
你不需要一直保持身边。在需要它的函数中创建它要便宜得多。而且,内部不会清除这个向量,而是一个新的临时向量,然后立即再次消失。tempvector()reset
1赞 john 6/15/2023
v[2] = "2";与超载无关. 用于分配向量,当您写入时,您分配的是字符串而不是向量。问题是你返回了错误的类型。它应该返回 not .然后你就可以写了。vector::operator=vector::operator=v[2]="2";vector::operator[]T&Tv[2]="2";

答:

0赞 463035818_is_not_an_ai 6/15/2023 #1

让我们将其分解为一个更简单的示例,因为坦率地说,您的代码有太多问题无法通过单个答案来解决。评论中提到了其中的一些,你应该认真对待它们,因为你非常破碎。让我们只考虑一个方法的实现,该方法返回您可以分配给的内容。换句话说,我们想编写以下代码:vector

int main() {
     foo f;
     f.set("123");       // sets a member
     f.get() = "42";     // gets something that can be used to 
                         // assign to the member
     std::cout << f.get() << "\n";
}

输出应该是 .42

我们需要一个默认构造函数。我们需要一个方法来设置字符串。单个字符串作为成员就足够了。要开始工作,您不需要实现 .分配的是一个字符串。 已经有一个 .但是,应返回对内部字符串的引用。它不应返回内部字符串的副本,因为修改该副本不会对成员产生任何影响。返回引用。pushf.get() = "42";operator=std::stringoperator=get()

struct foo {
    std::string data;

    void set(const std::string& x) { data = x; }

    using reference = std::string&;

    reference get() { return data; }
    
};

现场演示

对于进一步的阅读,我建议...