【问题标题】:How can I return an array?我怎样才能返回一个数组?
【发布时间】:2009-05-10 18:28:28
【问题描述】:

有没有办法从函数中返回一个数组?更具体地说,我创建了这个函数:

char bin[8];

for(int i = 7; i >= 0; i--)
{
    int ascii='a';
    if(2^i-ascii >= 0)
    {
        bin[i]='1';
        ascii=2^i-ascii;
    }
    else
    {
        bin[i]='0';
    }
}

我需要一种方法来返回bin[]

【问题讨论】:

    标签: c++ arrays return-value


    【解决方案1】:

    你不能这样做,但你可以:

    • 返回一个动态分配的数组 - 最好由智能指针拥有,这样调用者就不必关心为其释放内存 - 您也可以通过这种方式返回 std::vector 之类的东西。
    • 通过指针(建议)或非 const 引用填充作为参数传递给您的数组/向量。

    【讨论】:

    • +1 票,很好的答案。只是为了澄清 Keand64 的事情,你不能返回 bin 因为分配给它的内存将在函数完成后释放,所以你要么必须接收分配在其他地方的内存的数组,要么使用动态内存小心停止使用后释放它。
    • @Neil:如果您决定直接返回对象,则在右值复制期间可能会严重影响性能 - 理论上,向量的存储可能会移动到右值副本而不是复制,但我我很确定这不会发生。
    【解决方案2】:

    您的数组是分配在堆栈上的局部变量。您应该使用new [] 在堆上分配它。然后你可以说:return bin;。请注意,完成后您必须使用 delete [] 显式释放它。

    【讨论】:

    • 一个更好的办法是使用 new[] 创建数组并使用 delete[] 删除它。
    • @Neil Butterworth - 它与 Zifre 所说的有何不同?
    • 在 C++ 中,new 和 delete 不同于 new[] 和 delete[]
    • @Neil Butterworth:我认为 OP 对 C++ 足够熟悉,我可以省略 []s。
    【解决方案3】:

    你真的问错了问题。如果您想在 C++ 中进行字符串处理,请使用 std::string 和/或 std::vector 类,而不是 char 数组。然后你的代码变成:

    vector <char> func() {
        vector <char> bin(8);
        for( int i = 7; i >= 0; i-- ) {
           int ascii='a';
           if ( 2 ^ i - ascii >= 0 ) {
              bin[i] = '1';
              ascii = 2^i - ascii;
           }
           else {
            bin[i] ='0';
           }
        }
        return bin;
    }
    

    【讨论】:

      【解决方案4】:

      我认为你最好的选择是使用向量。它可以像数组一样以多种方式运行,并且有几个优点(长度与类型一起存储,自动内存管理)。

      void Calculate( std::vector<char>& bin) {
        for(int i = 7; i >= 0; i--)
        {
          int ascii='a';
          if(2^i-ascii >= 0)
          {
              bin.push_back('1');
              ascii=2^i-ascii;
          }
          else
          {
              bin.push_back('0');
          }
        }
      }
      

      【讨论】:

        【解决方案5】:

        如果你想返回一个数组的副本(可能对小数组有意义)并且数组的大小是固定的,你可以将它包含在一个结构中;

        struct ArrayWrapper {
           char _bin[8];
        };
        
        ArrayWrapper func()
        {
            ArrayWrapper x;
        
            // Do your stuff here using x._bin instead of plain bin
        
            return x;
        }
        

        或者只使用已经建议的 std::vector。

        【讨论】:

          【解决方案6】:

          与@ari 的回答类似,我想说已经有一个提升解决方案,boost::array 解决您的问题:

          boost::array<char, 8> f() {
              boost::array<char, 8> bin;
              for(int i = 7; i >= 0; i--) {
                  int ascii = 'a';
                  if(2 ^ i-ascii >= 0) {
                      bin[i] = '1';
                      ascii = 2 ^ i-ascii;
                  } else {
                      bin[i] = '0';
                  }
              }
          }
          
          ...
          boost::array<char, 8> a(f());
          

          [虽然我不确定你想用那个算法做什么,但请注意我认为你想做1 &lt;&lt; i(按位移位)而不是2 ^ i,这是不是 C++ 中的幂运算。]

          Boost 数组是一个普通数组,只是包装在一个结构体中,因此不会损失任何性能。它也将在下一个 C++ 版本中作为std::array 提供,如果您不需要它添加的begin()/size()/data()-sugar(作为容器),那么您自己很容易做到.就用最基本的吧:

          template<typename T, size_t S>
          struct array { 
              T t[S];
              T& operator[](ptrdiff_t i) { return t[i]; }
              T const& operator[](ptrdiff_t i) const { return t[i]; }
          };
          

          但像往常一样,使用其他人已经编写的工具,在本例中为boost::array。它还具有聚合的优点(这就是它没有用户声明的构造函数的原因),因此它允许使用大括号括起来的列表进行初始化:

          boost::array<int, 4> a = {{ 1, 2, 3, 4 }};
          

          【讨论】:

            【解决方案7】:

            您需要将数组 bin 作为参数传递给您的函数。 数组总是通过地址传递,因此你不需要返回任何值。 它会自动向您显示主程序中的所有更改

            void FunctionAbc(char bin[], int size);
            
            
            void FuncationAbc(bin, size)
            {
            for(int i = 7; i >= 0; i--)
            {
                int ascii='a';
                if(2^i-ascii >= 0)
                {
                    bin[i]='1';
                    ascii=2^i-ascii;
                }
                else
                {
                    bin[i]='0';
                }
            }
            
            }
            

            【讨论】:

              【解决方案8】:

              您需要通过引用传递,如下所示:

              void modifyBin(char (&bin)[8])
              {
                  /* your function goes here and modifies bin */
              }
              
              int main() 
              {
                  char bin[8];
                  modifyBin(bin);
                  /* bin has been updated */
                  return 0;
              }
              

              【讨论】:

                【解决方案9】:

                我认为其他人都回答了这个问题...使用容器而不是数组。这是std::string 版本:

                std::string foo() {
                    int ascii = 'a';
                    std::string result("00000000");
                    for (int i=7; i>=0; --i) {
                        if (2^i-ascii >= 0) {
                            result[i] = '1';
                            ascii = 2^i-ascii;
                        }
                    }
                    return result;
                }
                

                我不确定2^i-ascii 是否需要你。这将被解析为(2 ^ (i - ascii)),这有点奇怪。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-07-30
                  • 2020-12-19
                  • 2015-04-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多