- Dizi oluşturmak, elemanlara indisle erişmek ve onu döngüyle dolaşmak
std::vectorile eleman eklemek, silmek ve boyutunu bulmakstd::stringile 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.
#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;
}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.
#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;
}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.
| Metot | Ne 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:
#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;
}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.
#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;
}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.
#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;
}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::vectorbü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,findmetotlarını ve==ile karşılaştırmayı destekler.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
int a[4] = {3, 6, 9, 12}; verildiğinde a[2] kaçtır?