为矢量动态分配内存

Dynamically allocate memory for vectors

本文关键字:内存 动态分配      更新时间:2023-10-16

我正在尝试用向量替换数组,但我不知道如何替换。

替换此函数为矢量动态分配内存:

string readFile(string filename, string** list, int size){
    *list = new string[size];
    ifstream file(filename);
    string line;
    for (int i = 0; i < size; i++){
        getline(file, line);
        *(*list + i) = line;
    }
    file.close();
    return **list;
}

这是我尝试将其更改为向量,但运气不佳。非常感谢任何反馈:

string processFile(string filename, vector<string>** list, int size){
        *list = new vector<string>(size);
        ifstream file(filename);
        string line;
        for (int i = 0; i < size; i++){
            getline(file, line);
            *list[i] = line; // error
        }
        file.close();
        return **list; // error
    }

您需要一些适当的错误处理,但基本上,如果使用容器,您既不需要指针,也不需要固定大小:

std::vector<std::string> readLinesFromFile(const std::string& filename)
{
    std::vector<std::string> result;
    std::ifstream file(filename);
     for (std::string line; std::getline(file, line); )
     {
        result.push_back(line);
     }
     return result;
}

有几个问题:

  1. 您不需要使用vector**,vector相当于前面代码中的列表
  2. 返回类型为字符串,但返回的是矢量**

这个代码应该可以工作,但没有经过测试:

    void processFile(string filename, vector<string>& list, int size){
    //list = new vector<string>(size); // no need if you get a vector reference
    ifstream file(filename);
    string line;
    for (int i = 0; i < size; i++){
        getline(file, line);
        list.push_back(line); //the error was because you are assigning string to a vector<string>*
    }
    file.close();
    // you dont have to return, as vector is passed by reference
}

如果您仍然需要使用矢量的指针

    void processFile(string filename, vector<string>** list, int size){
    *list = new vector<string>(size); // bad practice
    ifstream file(filename);
    string line;
    for (int i = 0; i < size; i++){
        getline(file, line);
        (*list)->push_back(line); 
    }
    file.close();
    // you dont have to return,  as vector is passed by pointer
   }

将*list[i]=line更改为*list->push_back(line(,您应该可以处理第一个错误。

第二个错误将取决于您对返回值的意图。我认为return*list->front((;将给出与第一个示例相同的结果,但如果您计划返回的不仅仅是第一行,则需要进行一些串联。您只需创建一个本地字符串,并在读取每一行时附加它们。

希望你的老师知道在C++中使用新向量几乎总是一种代码味道,并且出于特定的原因使用它,并计划稍后修复它。

这里是一个工作示例。享受:(BTW-您不需要传递长度,只需实例化内存并使用push_back方法即可。

#include <vector>
#include <fstream>
#include <string>
using namespace std;
void processFile(string filename, vector<string>** list, int size);
void main()
{
    vector<string>* list = NULL;
    processFile("C:\temp.txt", &list, 13);
    int i = 1;
}
void processFile(string filename, vector<string>** list, int size){
    *list = new vector<string>();
    ifstream file(filename);
    string line;
    for (int i = 0; i < size; i++){
        getline(file, line);
        (**list).push_back(line); // error
    }
    file.close();
}