Преобразование струны до к станд.:: вектор <байт> эффективным способом

Различие в производительности между этими двумя является очень зависящим от реализации - при сравнении плохо реализованного станд.:: вектор к оптимальной реализации массива, массив победил бы, но изменил бы к лучшему его, и вектор победит...

, пока Вы сравниваете яблоки с яблоками (или и массив и вектор имеют постоянное число элементов, или оба изменены динамично), я думал бы, что различие в производительности незначительно, пока Вы применяете, получил практику кодирования STL. Не забывайте, что использование стандартных контейнеров C++ также позволяет Вам использовать предварительно прокрученные алгоритмы, которые являются частью стандартной библиотеки C++, и большинство из них, вероятно, будет лучше работать, чем средняя реализация того же алгоритма, который Вы создаете сами.

Однако по моему скромному мнению, векторные победы в сценарии отладки с STL отладки, поскольку большинство реализаций STL с надлежащим режимом отладки может, по крайней мере, highlight/cathc типичные ошибки, сделанные людьми при работе со стандартными контейнерами.

, О, и не забывают, что массив и вектор совместно используют то же расположение памяти, таким образом, можно использовать векторы для передачи данных наследию C или коду C++, который ожидает основные массивы. Следует иметь в виду, что большинство ставок выключено в том сценарии, тем не менее, и Вы имеете дело с необработанной памятью снова.

5
задан Etan 16 October 2009 в 18:04
поделиться

6 ответов

Самая простая вещь будет примерно такой:

const char *cstr = "bla"
std::vector<char> vec(cstr, cstr + strlen(cstr));

Конечно, не надо Если вы ее знаете, не вычисляйте длину.

Более распространенное решение - использовать класс std :: string :

const char *cstr;
std::string str = cstr;
8
ответ дан 13 December 2019 в 05:37
поделиться
std::vector<byte> myVector;
const char* str = "MyString";
myVector.assign( str, str+strlen(str) );
0
ответ дан 13 December 2019 в 05:37
поделиться

Наиболее очевидный вопрос: почему вы не используете просто std :: string:

std::string myString("MyString");

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

char myString[] = "MyString";

std::vector<byte> myVector(myString, myString+sizeof(myString));

Вы также можете рассмотреть с использованием std :: tr1 :: array:

std::tr1::array<byte, sizeof("MyString")> myArray = {"MyString"};

C ++ 0x также будет иметь std :: array .

0
ответ дан 13 December 2019 в 05:37
поделиться

Контейнеры STL, такие как вектор , всегда становятся владельцем, т.е. они управляют своей собственной памятью. Вы не можете изменить память, управляемую внутренне контейнером STL. По этой причине ваша попытка (и любая аналогичная попытка) обречена на провал.

Единственное допустимое решение - скопировать память или написать новый контейнер в стиле STL, который не будет владеть памятью, к которой он обращается.

5
ответ дан 13 December 2019 в 05:37
поделиться

Что-то в этом роде должно работать

 std::vector<byte> myVector = std::vector((byte*)cstring, (byte*)ctring + strlen(cstring))

Кроме того, это все еще будет просто перебирать строку c и вставлять значения в вектор. Как сказал Конрад, вы должны это делать именно так, поскольку векторы управляют своей собственной памятью.

0
ответ дан 13 December 2019 в 05:37
поделиться
const char *cstr = "bla"
std::vector<char> vec;
vec.resize(strlen(cstr)+1);
strcpy(&vec[0],cstr);
-1
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: