2011-04-18 7 views
7

Bir dizeyi tek bir karaktere veya bir dizeye bölmek istiyorum. Ittifak dizgisi temel dizgi işleme için standart olduğumuzdan (birkaç tekniği karıştırmak istemiyorum) boost::split'u kullanmak istiyorum.Boost tek bir karakterle ya da sadece bir dize ile bölünür

Tek karakter durumunda split(vec,str,is_any_of(':')) yapabilirdim, ancak yalnızca tek bir karakter belirtmenin bir yolu olup olmadığını bilmek istiyorum. Performansı artırabilir, ancak daha da önemlisi kodun tek bir karakterle daha açık olacağını düşünüyorum, çünkü is_any_of istediğim şeyin farklı bir anlamını taşımaktadır.

Bir dizeyle eşleşme için hangi sözdizimini kullanacağımı bilmiyorum. Bir regex oluşturmak istemiyorum; split(vec,str,match_str("::") gibi bazı basit sözdizimi iyi olurdu.

cevap

3

üstünde uygulayabilirsiniz. Aşağıdaki kodda, kısaca using namespace boost olduğunu varsayalım.

split(vec,str, is_from_range(':',':')); 

Alternatif lambda eğer izin verilir:

split(vec,str, lambda::_1 == ':'); 

veya özel bir yüklemi hazırlanıyor ise is_from_range amaca hizmet olabilir sadece algorithm/string izin verildiği takdirde bir karakter üzerinde bölme gelince
, izin verilir:

struct match_char { 
    char c; 
    match_char(char c) : c(c) {} 
    bool operator()(char x) const { return x == c; } 
}; 

split(vec,str, match_char(':')); 

David Rodri'guez, olarak bir dizgiye karşılık, split ile yol görünmemektedir. iter_split izin verilirse, muhtemelen aşağıdaki kod amacını buluşacak:

iter_split(vec,str, first_finder("::")); 
+0

Hepsi iyi. Teşekkür ederim. –

+0

Yardım ettiğine sevindim :-) –

+1

C++ 11 cevap: '[] (char c) {dönüş c == ':'}' yerli lambda. – MSalters

1

Basit simge üzerinde, is_any_of(single_option)'un ne anlama geldiğini anlamak oldukça kolay olduğundan is_any_of'u bırakırım. Gerçekten değiştirmek isterseniz, üçüncü öğe bir functor, bu yüzden split işlevine bir equals functor geçirebilirsiniz.

Bu yaklaşım, yineleme karakteri karakter olarak ifade edildiğinden, birden fazla simge ile gerçekten çalışmaz. Önceden oluşturulmuş alternatifler sunmak için kütüphaneyi bilmiyorum, ancak işlevselliği

10

aynı yanıtı bulmaya ama bir bulamadık. Sonunda kendi başıma bir tane üretmeyi başardım.

İhtiyacınız olan yüklemeyi oluşturmak için std::equal_to kullanabilirsiniz. Örnek:

boost::split(container, str, std::bind1st(std::equal_to<char>(), ',')); 

Tek bir karakter kullanarak bir dizgiyi ayırmam gerektiğinde bunu tam olarak böyle yaparım.

İlgili konular