Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712

Конвертирование std::vector в TByteDynArray и обратно

23.10.2018, 11:48. Показов 2158. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Есть вектор байт (std::vector<BYTE>). Необходимо создать переменную типа TByteDynArray с содержимым вектора. После работы с этой переменной ее содержимое необходимо отправить в вектор.
Из TByteDynArray в вектор отправку делаю так:
C++
1
2
3
4
std::vector<BYTE> vec;
TByteDynArray dyn;
vec.resize(dyn.Length);
vec.assign(dyn.begin(), dyn.end());
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.10.2018, 11:48
Ответы с готовыми решениями:

Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>...
Есть двухмерный вектор: std::vector&lt;std::vector&lt;TRabbitCell&gt; &gt; *cells(5, 10); Пытаюсь заполнить его объектами класса...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

17
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,257
23.10.2018, 12:08
А какая у Вас среда?
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
23.10.2018, 13:06  [ТС]
Цитата Сообщение от FFPowerMan Посмотреть сообщение
А какая у Вас среда?
C++Builder 10.2 CE
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.10.2018, 13:36
Зачем Вам сдался TByteDynArray ? Кстати у него что есть итераторы?
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,257
23.10.2018, 14:11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//---------------------------------------------------------------------------
#include <vcl>
#include <iostream>
#include <conio>
#include <vector>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
 
int i;
vector<unsigned char> VB(12);// = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22};
DynamicArray<int> F;
 
int main(int argc, char* argv[])
{
    F.Length = 12;
    F[0] = 0;
    F[1] = 1;
    F[2] = 2;
    F[3] = 3;
    F[4] = 4;
    F[5] = 5;
 
    for(i=0; i<12; i++)
        VB[i] = i+11;
 
    cout << "Do izmeneniya:\n";
    cout << "DynamicArray:\n";
    for(i=0; i<12; i++)
        cout << "F[" << i << "] = " << F[i] << "\n";
    cout << "Vector:\n";
    for(i=0; i<12; i++)
        cout << "Vector[" << i << "] = " << VB[i] << "\n";
 
 
    for(i=0; i<12; i++)
        F[i] = VB[i];
        //VB[i] = F[i]; - в обратную сторону;
 
    cout << "\n\nPosle izmeneniya:\n";
    for(i=0; i<12; i++)
        cout << "F[" << i << "] = " << F[i] << "\n";
    cout << "Vector:\n";
    for(i=0; i<12; i++)
        cout << "Vector[" << i << "] = " << VB[i] << "\n";
 
    getch();
    return 0;
}
//---------------------------------------------------------------------------
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
23.10.2018, 15:51  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Зачем Вам сдался TByteDynArray ? Кстати у него что есть итераторы?
Итераторы есть. Я использую компонент TIdTCPClient. Мне нужно отправлять запросы, состоящие из нескольких байт. Для этого можно использовать либо потомка TStream, либо TByteDynArray.

Добавлено через 11 минут
FFPowerMan, за код, конечно, спасибо. Но так я и сам мог. Чувствуется, нет простого способа осуществить то, что мне надо. Хотя есть вариант вообще не использовать TByteDynArray...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
23.10.2018, 20:40
Лучший ответ Сообщение было отмечено d7d1cd как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
#include <IdGlobal> // если используешь TIdTCPClient - этот файл уже должен быть подключен
// ...
    std::vector<BYTE> vec;
    TByteDynArray dyn;
 
    dyn = RawToBytes(&vec[0], 12); // std::vector -> TByteDynArray
 
    for(int i = 0; i < 12; i++) dyn[i] *= 3; // работаем с данными
 
    BytesToRaw(dyn, &vec[0], dyn.Length); // возвращаем назад в std::vector
В XE10 (поскольку уже доступны фичи C++11) можно &vec[0] заменить на vec.data()...
3
23.10.2018, 21:07  [ТС]

Не по теме:

volvo, вот расскажите, откуда я мог узнать о таком способе? Такое дается только с опытом или я как то неправильно ищу?

0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.10.2018, 22:39
Надо смотреть исходники вероятно что бы знать.

Хотя можно нарыть темы вроде этой:
BytesToRaw (Indy 10)

Добавлено через 5 минут
Да тут вообще вопрос зачем тогда вектор если есть массив байт ...
Почему не использовать что-то одно?
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
24.10.2018, 07:35  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Да тут вообще вопрос зачем тогда вектор если есть массив байт... Почему не использовать что-то одно?
Происходит расширение возможностей существующей программы, в которой за основу хранения данных был выбран вектор. Если менять вектор на массив байт, то надо очень много кода переделывать.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
24.10.2018, 11:58
Цитата Сообщение от d7d1cd Посмотреть сообщение
Если менять вектор на массив байт, то надо очень много кода переделывать.
Значит, надо переделывать сейчас. Если сейчас налепить заплаток, то потом, при очередном расширении возможностей (а оно будет, обязательно), кода придется переделывать еще больше.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.10.2018, 12:54
Цитата Сообщение от d7d1cd Посмотреть сообщение
на массив байт
Зачем Вам массив когда есть TByteDynArray?
Если у него есть итераторы то вообще нормально, можно алгоритмы применять прямо к нему.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
24.10.2018, 12:55  [ТС]
volvo, а как быть, если я переделаю сейчас код под массив байт, а потом новая добавляемая возможность "захочет" вектор? Я не спорю, просто возник такой вопрос.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
24.10.2018, 13:03
У тебя всего два варианта: 1) либо переводить все на TByteDynArray (или TMemoryStream), потому что только с ними работает TIdTCPClient, и все новые фичи тоже реализовывать с использованием этих сущностей, либо 2) использовать для фич любые средства, которые тебе удобны, но тогда придется написать (и использовать ВСЕГДА при работе с TIdTCPClient) некий класс-прокси, который будет принимать std::vector (или какой-нибудь другой контейнер, или вообще один из нескольких контейнеров), и передавать TIdTCPClient те же данные но в виде TByteDynArray. Тогда, если тебе вздумается потом при очередном обновлении функционала использовать std::queue, допишешь в этот класс метод, принимающий std::queue, и конвертирующий его в TByteDynArray. один раз написал, и потом используешь постоянно, не задумываясь о том, как что и где преобразовывать (этим будет заниматься прокси-класс).
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
24.10.2018, 13:30  [ТС]
По сути, сейчас получилось по второму варианту. У меня есть функция, которая осуществляет обмен информацией с устройством по выбранному каналу связи. Раньше там был только последовательный порт, теперь добавился TCP/IP канал. Эта функция работает с вектором. Для работы с TCP/IP внутри этой функции буду использовать TByteDynArray.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.10.2018, 18:19
Делать ф-цию шаблонной и передавать итераторы? Т.е как сделано в алгоритмах.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,151
Записей в блоге: 3
24.10.2018, 18:24
Цитата Сообщение от volvo Посмотреть сообщение
&vec[0] заменить на vec.data().
А есть разница для скорости присвоения?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.10.2018, 19:03
Цитата Сообщение от Dinkin Посмотреть сообщение
А есть разница для скорости присвоения?
vec.data() кажется не везде будет проходить, как я помню там const стоит.
Касательно скорости тяжело гадать, скорее всего компилятор все оптимизирует.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.10.2018, 19:03
Помогаю со студенческими работами здесь

Вывести значения std::vector<std::vector<int*> >
Подскажите, как вывести значения? const size_t row = 3; const size_t col = 3; std::vector&lt;std::vector&lt;int*&gt; &gt; imatrix; ...

Как изменять размер std::vector<std::vector>?
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: std::vector&lt;std::vector&lt;float&gt;&gt; data; ...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator>
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...

Выделение памяти для вектора std::vector<iris> *v = new std::vector<iris>
Можно ли создать вектор, выделить для него память, так что бы он &quot;жил&quot; до конца работы программы. иметь на него постоянную...

Std::vector/QVector в классе или std::vector/QVector классов?
Доброе время суток! Собственно вопрос в самой теме, есть некий класс class WorkJornal { private: string manager; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru