创建个人字符串向量类

时间:2017-10-20 11:05:27

标签: c++

我不允许使用矢量类,所以我需要自己制作。我做了一个int矢量类,它工作正常,但是当试图为字符串创建它时,它编译但由于指针而给我一个错误。我提出错误的任何暗示?我所做的只是更改字符串的每个int元素,但显然这不起作用。请帮助我很困惑。

    public:
        StringRow(){
            elements = new string;
            size = 0;
        }

        ~StringRow(){...} 

        void push_back(string value){...}

};

2 个答案:

答案 0 :(得分:0)

您定义了指向变量的指针,而不是变量数组。

elements = new string;

将其替换为

elements = new string[size];

您可以通过定义初始大小来优化算法。只有在必要时才创建更大的数组。

答案 1 :(得分:0)

有几个问题:

  • 在构造函数中,您不需要分配任何内容。你甚至不需要这里的构造函数,你可以在声明成员时直接初始化成员。
  • 如果您使用string* tmpElementsArray = new string[size + 1];进行分配,则需要使用delete [] tmpElementsArray解除分配;

更正了工作版本:

#include <string>
#include <iostream>

using namespace std;

class StringRow {

private:
  string* elements = nullptr;
  int size = 0;

public:
//  constructor not needed
//    StringRow() {
//      elements = nullptr;
//     size = 0;
//    }

  ~StringRow() {
    delete []elements;
  }

  void push_back(string value) {

    string* tmpElementsArray = new string[size + 1];

    for (int i = 0; i<size; i++) {
      tmpElementsArray[i] = elements[i];
    }

    delete [] elements;
    elements = tmpElementsArray;
    elements[size] = value;
    size++;
  }

  int length() {
    return size;
  }

  string at(int index) {
    if (index<size) {
      return elements[index];
    }
  }
};


int main()
{
  StringRow s;
  string str1 = "hello";
  string str2 = "hello2";
  s.push_back(str1);
  s.push_back(str2);

  cout << s.at(0) << endl ;
  cout << s.at(1) << endl;
}

如果delete []elementselements,则执行nullptr即可。

注意:这不是最有效的方法。