2015-01-30 27 views
7

dizgisi elemanlarının özniteliklerini çıkar Bir char dizisinin başlangıcından bir dizi öğeyi ayıklamak ve bir dizeye koymak istiyorum. Aralık, eleman sayısından az veya ona eşit olabilir.char diziliminden dize

Bu benim ortaya koyduğum şey.

// buffer is a std::array<char, 128> 

std::string message; 

for (int i = 0; i < numberToExtract; ++i) 
{ 
    message += buffer.at(i); 
} 

Bunu yapmanın daha iyi bir yolu var mı?

std :: string'in iterator yapıcısı gibi bir şeye bakıyordum. Örneğin. std::string(buffer.begin(), buffer.end()) ama tüm öğeleri istemiyorum.

Teşekkürler. Bu dizinin kullanılması bitişik bellek beri işaretçi aritmetik kullanıyor

std::string(buffer.begin(), buffer.begin() + numberToExtract) 

Sen ikinci örnekle yakınız

+0

STL ile çalışırken, nesneleri ilklendiren döngüleri sorgulamak genellikle iyi bir fikirdir. – Wolf

+1

@Wolf [Bu STL değil] (http://stackoverflow.com/a/5205571/2069064). – Barry

+0

@Barry I [see] (https://en.wikipedia.org/wiki/C%2B%2B_Standard_Library). Ben döngüler * ile başlatılan C++ Standart kapsayıcılar için dikkat *. – Wolf

cevap

13

Sen end kadar gitmek gerekmez

std::string(&buffer[0], &buffer[numberToExtract]); 

veya bir işaretçi ve bir uzunluğa alan kurucuya kullanın:

std::string(&buffer[0], numberToExtract); 
std::string(buffer.data(), numberToExtract); 
+0

ptr + len ile yapıcı en kompakt, +1 gibi gözüküyor, belki bu varyant ilk önce başlamalıdır. – Wolf

+0

Teşekkürler. Bunu neden düşünmediğimi bilmiyorum. – ksl

2

, sen yapabilirsiniz.

std::string(buffer.begin(), buffer.begin() + numberToExtract) 

ya:

+0

Teşekkürler. Aynı cevap birkaç kez geldi. – ksl

2

Rastgele erişim yineleyicileri, aritmetik işlem yapmanıza izin verir:

std::string(buffer.begin(), buffer.begin() + numberToExtract); 
+0

Teşekkürler. Aynı cevap birkaç kez geldi. – ksl