Hàm có thể trả về 1 mảng hay không?

Khi viết 1 hàm thì lệnh return có thể trả về 1 mảng ko mn?

C++ thì bạn trả về cái gì cũng được hết á. Vô tư.
Nhưng sau này bạn học lên cao thì phải hiểu cách nó làm thế nào trong stack, để còn optimize nữa.

1 Like

nếu nó trả về mảng thì lưu thế nào ạ

bài toán tìm các ước của 1 số ,muốn nó return tất cả các ước thì làm sao ạ

trả về std::vector<int>

#include <iostream>
#include <vector>

std::vector<int> divisors(int n)
{
    std::vector<int> a;
    for (int i = 1; i <= n; ++i)
        if (n % i == 0)
            a.push_back(i);
    return a;
}

int main()
{
    auto a = divisors(10);
    for (int x : a) std::cout << x << ' ';

    //hoặc dài dòng hơn
    std::vector<int> a = divisors(10);
    for (int i = 0; i < a.size(); ++i)
        std::cout << a[i] << ' ';
}
1 Like

nếu muôn tự viết hàm thì viết sao ạ

tự viết hàm là sao…

ko dùng đến thư viện vector

vậy thì em phải có 1 con trỏ sẵn ở chỗ trả về, rồi truyền con trỏ này vào cái hàm tìm ước kia. Trong hàm truyền ước duyệt 2 lần, lần đầu tiên đếm xem n có bao nhiêu ước, rồi cấp phát bộ nhớ cho đủ, rồi vòng lặp thứ 2 cho các ước đó vào

int* getDivisors(int n, int& count)
{
    // đếm xem n có bao nhiêu ước
    count = 0;
    for (int i = 1; i <= n; ++i)
        if (n % i == 0)
            count++;
    // cấp phát bấy nhiêu chỗ trống cho mảng a
    int* a = new int[count];
    // copy các ước đó vào mảng a
    for (int i = 1, j = 0; i <= n; ++i)
        if (n % i == 0)
            a[j++] = i;
    return a;
}

int main()
{
    int  count;
    int* a = getDivisors(10, count);
    for (int i = 0; i < count; ++i)
        std::cout << a[i] << " ";

    // nhớ phải giải phóng a sau khi xài xong
    delete[] a;
}

xài thẳng vector cho nó khỏe, khỏi phải nhớ cấp phát bao nhiêu, giải phóng lúc nào, khỏi cần biến count phụ trợ để biết a có bao nhiêu phần tử, v.v…, và viết hàm trả về thẳng cái mảng cho dễ hiểu thay vì phải trả về con trỏ

1 Like

số là do mình nhâp vào nên chỗ n%i==0 có vẻ ko đúng a ạ

Anh cho em hỏi tại sau ở đây lại dùng keywork auto?

Để tự động xác định kiểu cho biến a gán với divisors(10).

Bạn google “auto c++11”.

1 Like

cảm ơn anh! Chứ hồi đó em đọc thì có auto thì cũng như không có auto! Nên em thắc mắc! vậy là em chậm công nghệ rồi!

do lười… std::vector<int> vs auto cái nào dễ hơn

2 Likes

Chào anh tntxtnt!
tại em không biết nên hỏi chứ không có gì hết anh! Mà nhờ anh em mới biết thêm C++ 11

trong C thì HOÀN TOÀN ĐƯỢC, bạn chỉ cần hiểu về con trỏ là được

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?