搜尋

首頁  >  問答  >  主體

c++ - 数组的引用作为返回值,为什么报错?

初学者,但在网上找不到答案。。有哪位好心人能帮我看看,不甚感激

template<int SIZE> 
int(&a)[SIZE] insertSort(int(&arr)[SIZE])
{
    return arr;
};
void main()
{
    int arr[] = {2,4,56,65,3,6,9,4,3,5,8,4,2,1,0};
    insertSort(arr);//提示找不到insertSort函数,如果将函数的返回值修改一下,编译就能通过
}
伊谢尔伦伊谢尔伦2885 天前576

全部回覆(3)我來回復

  • 迷茫

    迷茫2017-04-17 11:58:00

    你的函數寫法也有問題,stackoverflow找一個答案,親測可運行

    template<size_t n>
    int (&insertSort(int (&arr)[n]))[n]
    {
        return arr;
    }
    

    http://stackoverflow.com/a/2302395

    順便叨逼一句,盡量不要這麼做

    1. 這種程式碼難以閱讀,而且這樣的template不甚科學,來一個新的n就會產生一個新的函數
    2. 想返回數組的話可以用指針,但也盡量不要這麼做,因為函數內分配內存容易造成內存洩漏(除非它只乾了分配內存這一件事)
    3. 正確的用數組的回傳方式是傳一個已分配好記憶體的指標進去如這樣void sort(const int *arr, int *sortedArr)
    4. 更推薦用vector

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 11:58:00

    第一行是這樣的:template<int SIZE>

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:58:00

    既然是使用的C++,這裡是可以不用指標做到類型安全的。如 @wangdai 說的vector。至於返回,賦值什麼的這些都不需要管,最簡單的直接使用out参数

    #include <vector>
    #include <utility>
    #include <iostream>
    
    template<class t>
    void insert_sorter(std::vector<t>& array /* out */) {
        /// ...
        array[3] = 0xff;
    }
    
    int main() {
        std::vector<int> array = {1, 2, 3, 4, 5};
        insert_sorter(array);
        std::cout << array.at(3) << std::endl;
    }
    

    當然,如果你必須透過返回來到達高比格的效果,那就這樣

    #include <vector>
    #include <utility>
    #include <iostream>
    
    template<class t>
    std::vector<t> insert_sorter(std::vector<t>& array) {
        /// ...
        array[3] = 0xff;
    
        /// move 语义不会重复拷贝array的data数据
        return std::move(array);
    }
    
    int main() {
        std::vector<int> array = {1, 2, 3, 4, 5};
        /// 这里使用了完美的移动赋值操作,是不是比`C`的方式顺眼多了
        /// 不过要记住array后面不能再使用了
        std::vector<int> ret = insert_sorter(array);
        std::cout << ret.at(3) << std::endl;
    }
    

    老實說,正統的C++方式應該是

    /// 按stl的范式实现自己的sort
    std::sort(s.begin(), s.end(), [](int a, int b) {
        return b < a;   
    });
    

    回覆
    0
  • 取消回覆