【问题标题】:How to return array of strings?如何返回字符串数组?
【发布时间】:2011-07-27 02:02:00
【问题描述】:

我有功能:

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[]

我该怎么做?

【问题讨论】:

    标签: c++ arrays string return


    【解决方案1】:

    不要。数组不可复制。

    请改用std::vector&lt;std::string&gt;

    【讨论】:

      【解决方案2】:

      标准 8.3.5p6:

      函数不应具有数组或函数类型的返回类型,尽管它们可能具有指针类型或对此类事物的引用的返回类型。

      正如@Tomalak 所暗示的,对数组说不。它们与各种陷阱有关,如果您可以改用 vector,通常可以避免这些陷阱。

      【讨论】:

        【解决方案3】:

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

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

        但是你需要释放你使用delete[]分配的内存以避免内存泄漏。

        问问自己:

        • 您的代码的哪一部分应该负责执行此操作?
        • 您还记得那个指针稍后在您的代码的其他地方表示一个动态分配的数组吗?
        • 如果在程序中传递该指针并在另一段代码调用delete[] 之后意外使用它会发生什么? (分段错误就是答案)。
        • 如果您传递一个指向数组的指针,使用该指针的代码如何知道您的数组的大小? std::vector 会为您计算物品数量,所以没问题。

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

        【讨论】:

        • 另一个由示例提出并由vector 解决的棘手问题:调用函数如何知道数组中有多少元素?
        • @thefourtheye 当然,这比返回一个指向数组的裸指针要好,但比使用像 vector 这样的容器更糟糕,它为您提供了一个 api 来管理数据。请参阅上面 aschepler 的观点。
        【解决方案4】:

        我也建议不要返回 std::vector&lt;std::string&gt;。相反,我会传递一个迭代器,并让函数将数据写入迭代器指向的任何位置。这样,该函数同样可以将数据写入向量、双端队列或(如果需要)直接写入输出流。

        使用它,您的函数几乎是微不足道的:

        // 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 - 我比我更喜欢你的答案,因为它避免了(相对)昂贵的副本。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多