2009-03-12 24 views
6

Bu soruyu stackoverflow üzerinde bulamıyorum. Ama insanların STL (süslü bir destek yok) nasıl kullandığını merak ediyorum ... sadece bir moda olan STL. kod örneği ile uzun yıllar ... ve belki Sorunlar üzerinde edinilen Tricks/ipuçları/çoğunlukla kullanılan vakalar ... En çok kullanılan STL algoritması, yüklemleri, yineleyicileri

Hadi paylaşalım ... Yanıt başına

bir ipucu ... -

Düzenleme o downvotes sonuçlanan gibi kötü bir sorudur? işaretçi + yeni yerine vektörü kullanarak

+1

Bu soru gerçekten yararlı buluyorum. Bununla birlikte, işe yaramaz bazı cevaplar ... ... ve katkıda bulunan herkese göre. – AndreasT

cevap

7

Bir programa girdi Ayrılalı için (adım adım elde) döngüler gelen şeyler için, benim projelerin neredeyse tamamında STL kullanın. daha sonra ayrıştırılması için bir std :: vektörüne boşluklar ve giriş sonucu ile bir giriş dizesi Tokenise

:

std::stringstream iss(input); 
std::vector<std::string> * _input = new std::vector<std::string>(); 

std::copy(std::istream_iterator<std::string>(iss), 
      std::istream_iterator<std::string>(), 
      std::back_inserter<std::vector<std::string> >(*_input)); 

Diğer sık ​​rotadan geri :: std ve <algorithm> tanımlanan çeşitli algoritmalar bulunmaktadır.

6

. Bu çok büyük.

3

En kullanışlı algoritma (IMHO) - std :: for_each

9

sevdiğim bir dizeye streamable şey değiştirmek için aşağıdaki: Sonra

template <class TYPE> std::string Str(const TYPE & t) { 
    std::ostringstream os; 
    os << t; 
    return os.str(); 
} 

: Var

string beast = Str(666); 
+0

boost :: lexical_cast: P –

+2

asıl soruya bakınız - izin verilmez –

+0

ama bu tam olarak lexical_cast kaynağı için hemen hemen tam olarak –

1

En çok kullanılan STL algoritmaları, yüklemleri veya yineleyicileri yoktur. C++ dilinde en çok kullanılan operatörün ne olduğunu sormak gibi. Daha sık ne kullanıyorsunuz, operator+ veya operator-? if'u while'dan mı tercih edersiniz? Ya da belki throw?

Her şey kullanılacak olduğunda kullanılır.

PS: Ben böyle sorular sormadan önce Scott Meyers tarafından Effective STL okumayı öneririm.

+1

Kitabım var –

+0

O zaman bu soruyu sorduğuma şaşırdım :) Gerçekten :) – Paul

+3

İnsanlara bir soru sormak için aptal olduklarını söylemek yararlı değil. – catphive

1

ressam sor "Ne favori/en çok kullanılan fırça?"

+0

Bunun işe yaramaz olduğunu ima ediyorsanız, ben aynı fikirde değilim. Kullandıkları hammaddeleri de önemsiyorlar. Ekspresyonistler, kaba vuruşlar yapmak için büyük fırçalar kullandılar, gerçekçi ressamlar çok ince olanları ve belki de kalemleri kullanıyorlar. Programlamada da benzer farklılıklar var. – Frank

+0

STL'nin farklı hedefler için farklı araçlara sahip olduğunu kastediyorum. Şu anki görevimden ne tür bir şeye ihtiyacım olduğu karşılaştırılamıyor. – bayda

+0

Ben bir ressamın yanı sıra bir programcıyım. Ressamların sık sık favori fırçalarını, araçlarını ve tekniklerini tartıştığını söyleyebilirim. – Benj

2

En sevdiği ya da en çok kullanılan algoritma/yüklem/yineleyici kullandığımı hatırlayamıyorum, sadece o anda başarmaya çalıştığım şeyin en iyi işini yapan.

4

Ben vektörü seviyorum. 'un olması gerektiği C++ dizilerinin ne olduğu. Gerçi çok fazla gerçek zamanlı çalışma yapıyorum. Belirlemeye ihtiyaç duymayan arkadaşlar listeyi tercih edebilir.

Hemen hemen herkes dize dışında heck kullanır.

Hala VS6'yı kullandığımız (burada karmaşık şablon instatiasyonlarını kaldıramıyor) algoritmayı fazla kullanamıyorum. Bu yakında olsa geçecek.

2

functional şeyler: nedense bir Bind Boost erişimi yoksa bind1st, bind2nd, mem_fun, equal_to vb oldukça yararlıdır.

Bu çok öznel bir soru ve çok fazla takım kodlama stilinize, proje türüne ve diğer bilinmeyen faktörlere bağlıdır.

6

İstream_iterator ve ostream_iterator'ı seviyorum.

akış okunurken başka herhangi bir kap gibi yaparak bir güzel kolay yolu:

// Copies a stream of integers on the std input 
// into a vector. 
int main() 
{ 
    std::vector<int> data; 
    std::copy(std::istream_iterator<int>(std::cin), 
       std::istream_iterator<>(), 
       std::back_inserter(data) 
      ); 

    // By uisng the istream_iterator<> the input just becomes another container. 
} 
+0

Oh Bu gerçekten güzel! Bu seçenek hakkında bilmiyordum teşekkür ederim! – petric

1

aşağıdaki biraz "kötü" olduğunu, ancak birçok hata bizi kurtardı.

(Güncelleme, @ Ricky65'in bana buradan geri bildirim yapmak için yaptığı yorum sayesinde teşekkür ederiz.) C++ 11, derleyiciniz destekliyorsa bundan çok daha üstün olan bir range-based for loop'a sahiptir; Yine de bazı gerçekten eski derleyicilerle çalışıyoruz.

 
#define FOREACH(iter,stlContainer) \ 
for (typeof(stlContainer.begin()) iter = stlContainer.begin(), \ 
            iter##End_Cached = stlContainer.end(); \ 
     iter != iter##End_Cached; \ 
     ++iter) 

(Ayrıntılı güncelleme, Boost devs kredi.) Bu gevşek küçük vakalar için hata ayıklama yapılarında gezinmek için daha kolay olma daha karmaşık ama makro BOOST_FOREACH daha yetenekli, ama vardır avantaj dayanmaktadır, ve boost başlıklarının küçük bir yığınını gerektirmez (bazı kod tabanlarında/gruplarında verboten bulunur).

  • kullanıcıları bind1st/bind2nd/ptr_fun/mem_fun önemsiz olmayan "ziyareti" için etkili bir şekilde kullanmak için arasındaki etkileşimler hakkında çok şey bilmesi gerekir: - std::for_each kullanma

    genellikle tercih edilir, ama bazı dezavantajları vardır Boost, bu sorunların çoğunu giderir, ancak herkesin, tek bir kullanım noktası için kendi ayrı bir funkerini (genellikle bir yapı) sağlaması gerekebilir; Söz konusu yapıların ilmiği çevreleyen işlev içinde, ilgili kodun "yerelliksiz" olmasına yol açacak şekilde bildirilemez - bazı durumlarda fonksiyonun geri kalanıyla aynı mantığa sahip olduğu gibi okur

  • değil her zaman güzel inline derleyici bağlı gelmez

yukarıda listelenen forEach makro birkaç şey sağlar: Eğer sınır testleri yanlış almazsınız, std::for_each gibi

  • (Sonu geçmeyen, vb.)
  • kullanacaktır Sabit kaplarda

Bir standart olmayan "typeof" uzantısı gerektirdiğini unutmayın.

 
list< shared_ptr<Thing> > m_memberList; 
// later 
FOREACH(iter, m_memberList) 
{ 
    if ((*iter)->getValue() < 42) { 
     doSomethingWith(*iter); 
    } 
} 

bu makro ile tamamen memnun değilim ama STL-farkında tasarımda olduğu kadar deneyimi olmayan özellikle programcılar için, burada çok değerli olmuştur:

Tipik kullanım olabilir.

(Yanıtı güncelleriz artıları/eksileri/kusurları işaret etmek çekinmeyin.)

+0

Hah, makronun bazı güvenlik notları eksik, biraz güncellemek olacak. Tabii ki, makro kullanımın her zamanki "eksileri" geçerlidir: tekrarlanan değerlendirme, vb. – leander

+0

Oh. Bu döngü, tekrar tekrar değerlendirmek istemez dikkat(). Döngüde yaptığınız şeye bağlı olarak akıllı olabilir veya olmayabilir. Tabii ki, yineleme konum olarak bir kabın içeriğinin değiştirilmesine hep 2013 yılında bu okuma zor bir öneri ... – leander

+1

olduğunu bana mutluluk aralığı-C++ 11 ilave edildi yapar. Bu makro iğrenç! – Ricky65

İlgili konular