SORU
1 HAZİRAN 2013, CUMARTESİ


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
1 HAZİRAN 2013, CUMARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • discokatze

    discokatze

    23 EYLÜL 2009
  • Moto Journal

    Moto Journal

    28 Mayıs 2007
  • RaverX DouBle StAg XI

    RaverX DouBl

    23 Mayıs 2008