İçeriğe geç
Educora
Orta18 dk5 / 10

Diziler, vektörler ve metinler

Birçok değeri tek bir ad altında sakla: sabit boyutlu diziler, büyüyebilen `std::vector` ve metinlerle çalışmak için `std::string`.

Kendini test et
Bu derste öğreneceklerin
  • Dizi oluşturmak, elemanlara indisle erişmek ve onu döngüyle dolaşmak
  • std::vector ile eleman eklemek, silmek ve boyutunu bulmak
  • std::string ile metin birleştirmek, ölçmek, kesmek ve aramak
  • Sınır dışına çıkma hatasından kaçınmak

Bir sınıfta 25 öğrenci var ve her birinin notunu saklaman gerekiyor. score1, score2, ... gibi 25 ayrı değişken oluşturmak yorucudur; öğrenci sayısını önceden bilmiyorsan da imkânsızdır. Bunun için diziler ve vektörler vardır: tek bir ad altında birçok değer. Metinlerle çalışmak için ise metin türü std::string kullanılır.

Diziler

Dizi, bellekte art arda yerleştirilmiş, aynı türden elemanların sabit boyutlu topluluğudur. Elemanlara indis ile erişilir ve numaralandırma 0'dan başlar: 5 elemanlı bir dizinin indisleri 0'dan 4'e kadardır. Dizinin boyutu derleme sırasında belirlenir ve sonra değişmez.

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;
}
Beklenen çıktı
First: 12
Last: 14
Sum: 68

std::vector: büyüyebilen dizi

Gerçek programlarda eleman sayısı çoğu zaman önceden bilinmez. std::vector (<vector> dosyasından), gerektikçe büyüyen bir dizidir: push_back sona eleman ekler, pop_back sonuncuyu siler, size() ise eleman sayısını döndürür. Açılı parantezlerdeki tür (std::vector<int>), vektörün ne sakladığını belirtir.

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;
}
Beklenen çıktı
Count: 5
Second: 92
Best: 95
After pop_back: 4

for (int s : scores) yazımı aralık tabanlı for döngüsüdür: vektörün her elemanını sırayla s değişkenine koyar. İndislere ihtiyacın yoksa bu en basit ve en güvenli yoldur.

MetotNe yapar
v.push_back(x)x'i sona ekler
v.pop_back()son elemanı siler
v.size()eleman sayısı
v[i]i indisli eleman (denetimsiz)
v.at(i)i indisli eleman (sınır denetimli)
v.front(), v.back()ilk ve son eleman
v.empty()vektör boşsa true
v.clear()tüm elemanları siler
std::vector'ün en çok kullanılan metotları

Vektörde her tür saklanabilir, örneğin metinler. İndis gerekiyorsa sıradan bir for döngüsü de çalışır. size() işaretsiz bir tür döndürdüğü için sayaç olarak std::size_t kullanmak uygundur:

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;
}
Beklenen çıktı
1. Aysel
2. Murad
3. Leyla
First: Aysel, last: Leyla

std::string ile metin

std::string metin saklar ve onunla çalışmak için pek çok hazır metoda sahiptir. Metinleri + ile birleştirebilir, uzunluğu length() ile bulabilir, tek bir karakteri [i] ile alabilir, bir parçayı substr(başlangıç, uzunluk) ile kesebilir ve find ile arama yapabilirsin.

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;
}
Beklenen çıktı
Hello, Baku!
Length: 12
First letter: B
Part: Hello
Found at: 7
Baku city
find, aranan metnin başladığı indisi döndürür: B harfi 7. konumdadır (sayma 0'dan başlar).

Bir metin de aslında art arda gelen karakterlerden oluşur; bu yüzden aralık tabanlı for döngüsüyle karakter karakter dolaşılabilir. Aşağıdaki program “Azerbaijan” sözcüğündeki küçük a harflerini sayar. Sonuca dikkat et: büyük A sayılmadı, çünkü C++ için 'A' ve 'a' farklı karakterlerdir. Metinler == ile de karşılaştırılabilir.

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;
}
Beklenen çıktı
Letter a appears 2 times
true

Önemli noktalar

  • Dizinin boyutu sabittir; indisler 0'dan “boyut − 1”e kadardır.
  • Sınır dışına çıkmak tanımsız davranıştır; at() indisi denetler.
  • std::vector büyüyebilir: push_back, pop_back, size, front, back.
  • for (int x : v) bir kapsayıcının her elemanını sırayla dolaşır.
  • std::string, birleştirmeyi (+), length, substr, find metotlarını ve == ile karşılaştırmayı destekler.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
int a[4] = {3, 6, 9, 12}; verildiğinde a[2] kaçtır?