动态分配向量的内存

时间:2014-04-30 05:43:21

标签: c++ vector dynamic-memory-allocation

我正在尝试用向量替换数组,但我无法弄清楚如何。

替换此函数以动态分配向量的内存:

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
    }

4 个答案:

答案 0 :(得分:1)

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

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 :(得分:0)

有几个问题:

  1. 您不需要使用向量**,向量相当于以前代码中的列表。
  2. 返回类型是字符串,但是您要返回vector **
  3. 此代码应该可以使用,但未经过测试:

        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
       }
    

答案 2 :(得分:0)

将* list [i] = line更改为* list-&gt; push_back(line),你应该对第一个错误感到满意。

第二个错误取决于您对返回值的意图。我想return * list-&gt; front();将给出与第一个示例相同的结果,但如果您计划返回的不仅仅是第一行,那么您将需要进行一些连接。您可以创建一个本地字符串,并在阅读时附加每一行。

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

答案 3 :(得分:-1)

这是一个工作示例。请享用 :) 顺便说一句 - 你不需要传递长度,只需实例化内存并使用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();
}