2015-01-30 2 views
7

Я хочу извлечь ряд элементов из начала массива символов и поместить их в строку. Диапазон может быть меньше или равен количеству элементов.Извлечь диапазон элементов из массива символов в строку

Это то, что я придумал.

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

std::string message; 

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

Есть ли лучший способ сделать это?

Я искал что-то вроде конструктора итератора std :: string. Например. std::string(buffer.begin(), buffer.end()), но я не хочу всех элементов.

Спасибо.

+0

При работе с STL часто возникает вопрос о циклах, которые инициализируют объекты. – Wolf

+1

@Wolf [Это не STL] (http://stackoverflow.com/a/5205571/2069064). – Barry

+0

@Barry I [см.] (Https://en.wikipedia.org/wiki/C%2B%2B_Standard_Library). Я переписываю его, чтобы * следить за стандартными контейнерами C++, инициализированными для циклов *. – Wolf

ответ

13

Вы не должны пройти весь путь до end:

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

или:

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

или использовать конструктор, который принимает указатель и длина:

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

Конструктор с ptr + len кажется самым компактным, +1, возможно, этот вариант должен идти первым. – Wolf

+0

Спасибо. Я не знаю, почему я об этом не думал. – ksl

2

Вы близки с вашим вторым примером, вы можете сделать

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

Это использование арифметики указателей, поскольку использование непрерывной памяти массива.

+0

Спасибо. Тот же ответ пришел в несколько раз. – ksl

2

Итераторы случайного доступа позволяют делать арифметические операции:

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

Спасибо. Тот же ответ пришел в несколько раз. – ksl