Döngü için bir iç kaçınarak eğer deyim?
Bir fonksiyonu writeVector gibi olan bir sınıf Writer aradım:
void Drawer::writeVector(vector<T> vec, bool index=true)
{
for (unsigned int i = 0; i < vec.size(); i ) {
if (index) {
cout << i << "\t";
}
cout << vec[i] << "\n";
}
}
Hala performansı hakkında endişe ederken bir kod çoğaltmak için çalışıyorum.
Bu işlev, benim her turda if (index) kontrol sonuç hep aynı olsa da for-döngü yapıyorum.
Bu aykırı "performans endişesi".
Kolayca for-döngü benim dış işaretlediğinizde bunu önlemek olabilir.
Ancak, kod yinelenen yükler getiririm:
void Drawer::writeVector(...)
{
if (index) {
for (...) {
cout << i << "\t" << vec[i] << "\n";
}
}
else {
for (...) {
cout << vec[i] << "\n";
}
}
}
Bu hem benim için.çözümleri kadar kötü yani
Düşünüyorum, iki özel fonksiyonlar, bunlardan biri dizin çıkışları ve diğer çağırır.
Diğer bir tek değer çıkışları.
Ancak, benim program ile nasıl kullanılacağını çözemedim, hala aramak görmek if Çek ihtiyacım kalmazdı
Probleme göre, polimorfizmi doğru bir çözüm gibi görünüyor. Ama buraya Nasıl Kullanmalıyım göremiyorum. Bu tür sorunu çözmek için tercih edilen yolu nedir?
Bu gerçek bir program değildirSadece bu tür bir sorunun çözülmesi gerektiğini öğrenmek ilgimi çekiyor.
CEVAP
Bir functor olarak döngü gövdesi pas içinde.-Derleme, herhangi bir performans ceza inlined alır.
Değişir ne geçerken fikri C Standart Kitaplığındaki her yerde. Denirstrateji desen.
Eğer C kullanım için izin verilen 11 eğer böyle bir şey yapabilir:
#include <iostream>
#include <set>
#include <vector>
template <typename Container, typename Functor, typename Index = std::size_t>
void for_each_indexed(const Container& c, Functor f, Index index = 0) {
for (const auto& e : c)
f(index , e);
}
int main() {
using namespace std;
set<char> s{'b', 'a', 'c'};
// indices starting at 1 instead of 0
for_each_indexed(s, [](size_t i, char e) { cout<<i<<'\t'<<e<<'\n'; }, 1u);
cout << "-----" << endl;
vector<int> v{77, 88, 99};
// without index
for_each_indexed(v, [](size_t , int e) { cout<<e<<'\n'; });
}
Bu kod mükemmel değil ama fikir olsun.
Eski C 98 bu gibi görünüyor:
#include <iostream>
#include <vector>
using namespace std;
struct with_index {
void operator()(ostream& out, vector<int>::size_type i, int e) {
out << i << '\t' << e << '\n';
}
};
struct without_index {
void operator()(ostream& out, vector<int>::size_type i, int e) {
out << e << '\n';
}
};
template <typename Func>
void writeVector(const vector<int>& v, Func f) {
for (vector<int>::size_type i=0; i<v.size(); i) {
f(cout, i, v[i]);
}
}
int main() {
vector<int> v;
v.push_back(77);
v.push_back(88);
v.push_back(99);
writeVector(v, with_index());
cout << "-----" << endl;
writeVector(v, without_index());
return 0;
}
Yine, kod, kusursuz deÄŸil ama size bir fikir verir.

Pythonic döngü İÇİN birleştirmek ve EĞ...
Özel kasa için en iyi Döngü Deyim son ...
Nasıl eğer bir dizin zaten mevcut deği...
Bir liste boyunca yineleme, döngü çıka...
Nasıl her döngü için Java çalışır?...