Loading Now

Sum Of Odd Elements

vector c++

Bài tập

Cho một vector chứa các số nguyên, bạn hãy viết hàm trả về tổng của các phần tử lẻ trong vector đó.

Ví dụ:

  • Với v = [1, 3, 2, 4] thì sumOfOddElements(v) = 4.
    Giải thích: 1 + 3 = 4.
  • Với v = [1, -4, 6, 7, 8, -3] thì sumOfOddElements(v) = 5.
    Giải thích: 1 + 7 + (-3) = 5.

Lý thuyết

Với bài này bạn có thể làm giống bài tập trước bằng cách sử dụng vòng lặp và toán tử [] để duyệt và tính tổng các phần tử lẻ trong vector nhưng trong C++ còn có nhiều cách làm khác. Bài này bạn sẽ được tìm hiểu về iterator và sử dụng nó để duyệt qua các phần tử trong vector.

Iterator trong C++

Trước khi tìm hiểu về Iterator trong C++ thì bạn nên tìm hiểu về con trỏlớp (class) trong C++ trước, nếu chưa rõ về 2 khái niệm này thì bạn nên học tại khóa C++ nâng caoLập trình hướng đối tượng trong C++ trước.

Iterator trong C++ là đối tượng được dùng để duyệt qua các phần tử trong các cấu trúc dữ liệu như vector, map, set, list, … bạn cũng có thể hiểu nó giống như 1 con trỏ mà trỏ tới các phần tử trong các cấu trúc dữ liệu này. Ví dụ về sử dụng iterator để duyệt qua các phẩn tử trong vector:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    // Khai báo vector
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3); 

    // Khai báo iterator
    vector<int>::iterator it;

    // Sử dụng iterator để duyệt vector
    for (it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }

    return 0;
}

Kết quả khi chạy chương trình:

1 2 3

Trong đó:

  • it = v.begin(): cho biến it trỏ tới phần tử đầu tiên trong vector
  • it != v.end(): kiểm tra xem biến it đã trỏ qua phần tử cuối cùng trong vector hay chưa. Bạn có thể hiểu v.end() là phần tử mà đứng sau phần tử cuối cùng trong vector.
  • it++: cho biến it trỏ tới phần tử tiếp theo trong vector.
  • *it: lấy ra giá trị của phần tử mà biến it đang trỏ tới, bạn cũng có thể dùng *it để gán giá trị cho các phần tử trong vector (ví dụ: *it = 0).

Nếu khó hình dung thì bạn có thể xem ví dụ đơn giản về cách mà iterator được cài đặt như bên dưới:

#include <iostream>

using namespace std;

class MyVector {
private:
    int data[3] = { 1, 2, 3 };
public:
    int* begin() {
        return data;
    }
    int* end() {
        // data + 3 là phần tử tử đứng sau phần tử cuối cùng trong mảng data
        return data + 3;
    }
};


int main() {
    // Bạn có thể hình dung p giống như biến iterator
    int* p;
    MyVector v;
    for (p = v.begin(); p != v.end(); p++) {
        cout << *p << " ";
    }
    return 0;
}

Kết quả khi chạy chương trình:

1 2 3

Trên thực tế thì iterator được cài đặt phức tạp hơn nhiều nhưng để dễ hình dung  thì bạn có thể dựa vào ví dụ trên.

Với các kiểu dữ liệu khác như vector<string>, vector<double> thì bạn cũng có thể sử dụng iterator để duyệt giống như sau:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<string> v;
    v.push_back("Welcome");
    v.push_back("to");
    v.push_back("Codelearn.io!");

    vector<string>::iterator it;

    for (it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }

    return 0;
}

Kết quả khi chạy chương trình:

Welcome to Codelearn.io!

Có thể bạn sẽ thắc mắc tại sao C++ lại có khái niệm iterator trong khi có thể không dùng iterator mà dùng vòng lặp như các bài tập trước. Thì đó là do ngoài vector thì trong C++ còn có rất nhiều các kiểu dữ liệu khác như set, map, list, … trong các kiểu dữ liệu này không phải kiểu dữ liệu nào cũng có thể sử dụng vòng lặp và toán tử [] để duyệt. Do đó, iterator được sinh ra để cung cấp 1 cách duyệt chung cho tất cả các kiểu dữ liệu này mà không cần quan tâm tới đó là kiểu dữ liệu gì, lưu trữ bên trong ra sao.

Ngoài ra, bạn còn có thể duyệt vector với cú pháp ngắn gọn giống như dưới đây:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    for (int i = 1; i <= 10; i++) {
        v.push_back(i);
    }
    
    for (auto x : v) {
        cout << x << " ";
    }

    return 0;
}

Kết quả khi chạy chương trình:

1 2 3 4 5 6 7 8 9 10

Hướng dẫn

Code mẫu:

int sumOfOddElements(vector<int> v)
{
    int result = 0;
    vector<int>::iterator it;
    for (it = v.begin(); it != v.end(); it++) {
        if (*it % 2 != 0) {
            result += *it;
        }
    }
    return result;
}

Hoặc:

int sumOfOddElements(vector<int> v)
{
    int result = 0;
    for (auto x : v) {
        if (x % 2 != 0) {
            result += x;
        }
    }
    return result;
}

Post Comment

Contact