Məzmuna keç
Educora
Orta18 dəq5 / 10

Massivlər, vektorlar və sətirlər

Çoxlu qiyməti bir adda saxla: sabit ölçülü massivlər, böyüyə bilən `std::vector` və mətnlə işləmək üçün `std::string`.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Massiv yaratmaq, elementlərə indekslə müraciət etmək və onu dövrlə gəzmək
  • std::vector ilə element əlavə etmək, silmək və ölçünü tapmaq
  • std::string ilə mətni birləşdirmək, ölçmək, kəsmək və axtarmaq
  • Hüdudlardan kənara çıxmaq səhvinin qarşısını almaq

Sinifdə 25 şagird var və hər birinin qiymətini saxlamaq lazımdır. 25 ayrı dəyişən — score1, score2, ... — yaratmaq yorucudur, şagirdlərin sayı əvvəlcədən məlum deyilsə isə, ümumiyyətlə mümkün deyil. Bunun üçün massivlər və vektorlar var: bir adda çoxlu qiymət. Mətnlə işləmək üçün isə sətirlər (std::string) var.

Massivlər

Massiv eyni tipli elementlərin yaddaşda ardıcıl düzülmüş, sabit ölçülü toplusudur. Elementlərə indekslə müraciət olunur və nömrələmə 0-dan başlayır: 5 elementli massivin indeksləri 0-dan 4-ə qədərdir. Massivin ölçüsü kompilyasiya zamanı müəyyən olunur və sonra dəyişmir.

C++
#include <iostream>

int main() {
    int temps[5] = {12, 15, 9, 18, 14};
    int sum = 0;
    for (int i = 0; i < 5; i++) {
        sum += temps[i];
    }
    std::cout << "First: " << temps[0] << '\n';
    std::cout << "Last: " << temps[4] << '\n';
    std::cout << "Sum: " << sum << '\n';
    return 0;
}
Gözlənilən nəticə
First: 12
Last: 14
Sum: 68

std::vector: böyüyə bilən massiv

Real proqramlarda elementlərin sayı çox vaxt əvvəlcədən məlum olmur. std::vector (<vector> faylından) lazım olduqca böyüyən massivdir: push_back sona element əlavə edir, pop_back sonuncunu silir, size() isə elementlərin sayını qaytarır. Bucaq mötərizələrindəki tip (std::vector<int>) vektorda nə saxlanacağını göstərir.

C++
#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores = {85, 92, 78};
    scores.push_back(95);
    scores.push_back(60);

    std::cout << "Count: " << scores.size() << '\n';
    std::cout << "Second: " << scores[1] << '\n';

    int best = scores[0];
    for (int s : scores) {
        if (s > best) {
            best = s;
        }
    }
    std::cout << "Best: " << best << '\n';

    scores.pop_back();
    std::cout << "After pop_back: " << scores.size() << '\n';
    return 0;
}
Gözlənilən nəticə
Count: 5
Second: 92
Best: 95
After pop_back: 4

for (int s : scores) yazılışı aralıq üzrə for dövrüdür: o, vektorun hər elementini növbə ilə s dəyişəninə yazır. İndekslərlə işləmək lazım deyilsə, bu, ən sadə və təhlükəsiz yoldur.

MetodNə edir
v.push_back(x)x-i sona əlavə edir
v.pop_back()sonuncu elementi silir
v.size()elementlərin sayı
v[i]i indeksli element (yoxlamasız)
v.at(i)i indeksli element (hüdud yoxlanışı ilə)
v.front(), v.back()birinci və sonuncu element
v.empty()vektor boşdursa true
v.clear()bütün elementləri silir
std::vector-un ən çox işlədilən metodları

Vektorda istənilən tipi, məsələn, sətirləri saxlamaq olar. İndeks lazımdırsa, adi for dövrü də işləyir. size() işarəsiz tip qaytardığı üçün sayğac kimi std::size_t götürmək məqsədəuyğundur:

C++
#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> names = {"Aysel", "Murad"};
    names.push_back("Leyla");
    for (std::size_t i = 0; i < names.size(); i++) {
        std::cout << i + 1 << ". " << names[i] << '\n';
    }
    std::cout << "First: " << names.front() << ", last: " << names.back() << '\n';
    return 0;
}
Gözlənilən nəticə
1. Aysel
2. Murad
3. Leyla
First: Aysel, last: Leyla

std::string ilə mətn

std::string mətn saxlayır və onunla işləmək üçün çoxlu hazır metodlara malikdir. Sətirləri + ilə birləşdirmək, length() ilə uzunluğunu tapmaq, [i] ilə ayrıca simvolu götürmək, substr(başlanğıc, uzunluq) ilə hissəsini kəsmək və find ilə axtarmaq olar.

C++
#include <iostream>
#include <string>

int main() {
    std::string city = "Baku";
    std::string greeting = "Hello, " + city + "!";
    std::cout << greeting << '\n';
    std::cout << "Length: " << greeting.length() << '\n';
    std::cout << "First letter: " << city[0] << '\n';
    std::cout << "Part: " << greeting.substr(0, 5) << '\n';
    std::cout << "Found at: " << greeting.find("Baku") << '\n';

    city += " city";
    std::cout << city << '\n';
    return 0;
}
Gözlənilən nəticə
Hello, Baku!
Length: 12
First letter: B
Part: Hello
Found at: 7
Baku city
find axtarılan mətnin başladığı indeksi qaytarır: B hərfi 7-ci mövqedədir (sayma 0-dan başlayır).

Sətir də simvollar ardıcıllığıdır, ona görə onu aralıq üzrə for dövrü ilə simvol-simvol gəzmək olar. Aşağıdakı proqram «Azerbaijan» sözündə kiçik a hərfini sayır. Nəticəyə diqqət et: böyük A sayılmadı, çünki C++ üçün 'A' və 'a' fərqli simvollardır. Sətirləri == ilə müqayisə etmək də olar.

C++
#include <iostream>
#include <string>

int main() {
    std::string word = "Azerbaijan";
    int count = 0;
    for (char c : word) {
        if (c == 'a') {
            count++;
        }
    }
    std::cout << "Letter a appears " << count << " times\n";
    std::cout << std::boolalpha << (word == "Azerbaijan") << '\n';
    return 0;
}
Gözlənilən nəticə
Letter a appears 2 times
true

Əsas fikirlər

  • Massivin ölçüsü sabitdir, indekslər 0-dan «ölçü − 1»-ə qədərdir.
  • Hüdudlardan kənara çıxmaq qeyri-müəyyən davranışdır; at() indeksi yoxlayır.
  • std::vector böyüyə bilir: push_back, pop_back, size, front, back.
  • for (int x : v) konteynerin hər elementini növbə ilə gəzir.
  • std::string birləşdirməni (+), length, substr, find metodlarını və == müqayisəsini dəstəkləyir.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
int a[4] = {3, 6, 9, 12}; olarsa, a[2] nəyə bərabərdir?