Başlığın yeni bir C++ özelliği gibi durmadığının farkındayım, zaten değil 🙂 Ama yeni bazı API’lerden bahsediyor olacağız 😉
Ara sıra, küçük kod parçaları paylaşacağımdan bahsetmiştim. Bu yazı da onlardan birisi olacak ve çok da uzun olmayacak. Öncelikle, yazının çıkış noktasından bahsedeyim isterseniz. Kızım için basit bir oyun tasarlıyordum, oyun temelinde aslında ileri ve geriye doğru ritmik sayma ile ilgili aynı zamanda da, sayıları bulma ve dikkat de gerektiyor. Bu oyun için de ikiye iki ızgaraya, sayıları rastgele dağıtma ihtiyacı hasıl oldu. İşte aşağıdaki kod parçası tam da bu amaca hizmet etmek için. Gerçi ben bunu farklı bir dilde (Godot oyun motorunun GdScript ile kullandım, buna ilişkin de yakında bir yazıyı sizler ile paylaşacağım) kullandım ama meramımı anlatabilmişimdir 🙂
Gelelim kodumuza:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <iostream> #include <random> #include <iomanip> using namespace std; int main() { // Sabitlerimiz constexpr int numberOfRows = 5; constexpr int numberOfColumns = 5; constexpr int range_from = 0; constexpr int increment = 2; constexpr int range_to = range_from + increment * numberOfColumns * numberOfRows; // Konteynerimizi verilen kapasitede dolduralim std::vector<int> values((range_to - range_from) / increment); // Gecirilen ucuncu parametre isiginde verilen konteyniri doldurur (value'yu de degistirilebilir yapiyoruz) std::generate(values.begin(), values.end(), [value = range_from, increment]() mutable { return value += increment; }); // Elimizde veriler var ama sirali. Asil sihrin dondugu yer std::shuffle(values.begin(), values.end(), std::mt19937{ std::random_device{}() }); // Simdi ciktiy bir goz atalim auto itr = values.cbegin(); for (int i = 0; i < numberOfRows; ++i) { // setw ile her bir hucrenin boyunu esitleyelim for (int j = 0; j < numberOfColumns; ++j) std::cout << std::setw(3) << *itr++ << " "; std::cout << "\n"; } return 0; } |
Kısaca izlediğimiz adımlara ve kullandığımız API’lere bir göz atalım:
- Öncelikli olarak karıştırmak için kullanacağımız sayı kümesini oluşturuyoruz,
- Sonra std::generate ile verilen konteynerlerin içeriğini jenerik bir şekilde, geçirilen son parametre ile dolduruyoruz. Bu API C++ 17 ile gelen bir API bu arada,
- Son olarak da std::shuffle ile geçirilen konteynerin içeriğini yine geçirilen üçüncü parametre ışığında lineer zamanda karıştırır. Bu API de C++ 11 den beri sunulmakta.
Bu kısa yazımızın da sonuna geldik. Bir sonraki yazımda görüşmek dileğiyle. Bol kodlu günler.