2011-03-31 122 views
2

我有功能:如何返回字符串数组?

int read_file() { 
    ifstream file("plik"); 
    if(!file.is_open()) { 
    throw -1; 
    } 
    int i = 0; 
    string line[MAXSIZE]; 
    while(getline(plik, line[i])) { 
    cout<<line[i]<<endl; 
    i++; 
    } 

    return i; 
} 

但我想返回字符串数组:

line[]

我怎样才能做到这一点?

回答

14

不要。数组不可复制。使用std::vector<std::string>代替。

3

如果你真的,真的想,你可以动态分配一个数组,并返回一个指向该数组:

std::string* getArray() 
{ 
    return (new std::string[10]); 
} 

但你需要满足释放你分配使用delete[]避免记忆内存泄漏。

问自己:

  • 你的代码位应该负责这样做呢?
  • 您是否还记得那个指针稍后在代码的其他地方代表动态分配的数组?
  • 如果您将程序指针传递给程序并在另一位代码之后又意外地将其用于某处,则会发生什么情况?delete[]? (分段错误是答案)。
  • 如果将指针传递给数组,那么使用该指针的代码如何知道数组的大小? std::vector为你保留物品的数量,所以没有问题。

这就是为什么使用std::vector<std::string>是一个更好的主意。返回一个指向动态分配数组的指针会引入各种问题,这些问题最好避免而不是解决。

+2

这个例子提出的又一个棘手的问题,由'vector'解决:调用函数如何知道数组中有多少元素? – aschepler 2011-03-31 17:16:14

+0

@aschepler - 伟大的一点,加入回答。 – razlebe 2011-03-31 17:18:37

+0

由downvote困惑 - 任何解释? – razlebe 2011-03-31 17:26:47

3

标准8.3.5p6:

功能不应有类型的阵列或函数的返回类型,尽管它们可能具有类型指针或引用的这样的事情返回类型。

正如@Tomalak暗示的那样,对数组说“不”。如果你可以使用vector来代替,那么它们通常可以避免的各种问题。

2

我建议不要返回std::vector<std::string>。相反,我会传递一个迭代器,并让该函数将数据写入迭代器指向的任何位置。这样,函数可以同样很好地将数据写入向量,或者deque,或者(如果你想要的话)直接写入输出流。

利用这一点,你的函数的边界上的琐碎:

// I've changed the definition slightly, to let you pass it a filename instead 
// of hard-coding one. 
// 
template <class outIt> 
void read_file(std::string const &filename, outIt output) { 
    std::ifstream in(filename); 
    std::string line; 

    while (std::getline(in, line)) 
     *output++ = line; 
} 

以此来将数据复制到标准输出,大致在的问题,你会做这样的事情:

read_file("plik", std::ostream_iterator<std::string>(std::cout, "\n")); 
+1

+1 - 我喜欢你的答案比我的好,因为它避免了(相对)昂贵的副本。 – razlebe 2011-03-31 21:33:07