powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какой контейнер посоветуете?
7 сообщений из 7, страница 1 из 1
Какой контейнер посоветуете?
    #33508945
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется VCL TMemoryStream с данными.

Необходимо получить STL контейнер с итераторами и передать туда содержимое
стрима VCL.
Создавать вектор и побайтно заполнять его, думаю накладно.

Существуют ли контейнеры куда можно передать начало и конец области
памяти без копирования побайтно?


Дмитрий.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Какой контейнер посоветуете?
    #33508997
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю, что такое TMemoryStream, но любой контейнер, поддерживающий assign подойдёт.

int a[1000];
for(int i=0; i< 1000; i==)
a = i;
vector<int> v;
v.assign(a,a+1000);

разумеется при условии, что копируемый объект лежит в памяти непрерывно.
...
Рейтинг: 0 / 0
Какой контейнер посоветуете?
    #33509012
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем вам контейнер - судя по описанию задачи нужен поток...
...
Рейтинг: 0 / 0
Какой контейнер посоветуете?
    #33509014
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поток + потоковый итератор. Все это есть в STL
...
Рейтинг: 0 / 0
Какой контейнер посоветуете?
    #33509102
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname,

>int a[1000];
>for(int i=0; i< 1000; i==)
>a = i;
>vector<int> v;
>v.assign(a,a+1000);

>разумеется при условии, что копируемый объект лежит в памяти непрерывно.

ПАСИБОЧКИ большое!

в доке метод assign описан как принимающий два итератора,
однако в моем случае сработала передача обыкновенных указателей на память.
Странно. Я не уверен что это правило работает для всех случаев в STL.

Вот код методя, который я мучаю для приспосбливания к Base64 перекодированию
под BCB

Если кто может - можно ли сократить данный метод?

#inclide base64.h

void __fastcall BinStreamToStringBase64(TMemoryStream *p_Stream, AnsiString
&p_String)
{
base64<char> encoder;
int _State = 0;
std::vector<char> a_Vector;
a_Vector.assign(reinterpret_cast<char *>(p_Stream->Memory),
reinterpret_cast<char *>(p_Stream->Memory) + p_Stream->Size);
std::stringstream out;
ostreambuf_iterator<char> _Out = out.rdbuf();
std::vector<char>::iterator _From = a_Vector.begin();
std::vector<char>::iterator _To = a_Vector.end();
encoder.put(_From, _To, _Out, _State, base64<>::crlf());
p_String = out.str().c_str();
}


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Какой контейнер посоветуете?
    #33509131
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void __fastcall BinStreamToStringBase64(TMemoryStream *p_Stream, AnsiString
&p_String)
{
base64<char> encoder;
int _State =  0 ;
std::stringstream out;
ostreambuf_iterator<char> _Out = out.rdbuf();
std::vector<char>::iterator _From = a_Vector.begin();
std::vector<char>::iterator _To = a_Vector.end();
encoder.put(reinterpret_cast<char *>(p_Stream->Memory), reinterpret_cast<char *>(p_Stream->Memory) + p_Stream->Size, _Out, _State, base64<>::crlf());
p_String = out.str().c_str();
}
Ну и покажите ваш base64.h в аттаче.

Дело в том, что для vector<_Type> однонаправленный итератор вполне эквивалентен _Type *.
И, похоже, encoder.put требует однонаправленные итераторы, только для прохода от From к To.
...
Рейтинг: 0 / 0
Какой контейнер посоветуете?
    #33509423
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname,

>Дело в том, что для vector<_Type> однонаправленный итератор вполне
эквивалентен _Type *.
>И, похоже, encoder.put требует однонаправленные итераторы, только для
прохода от From к To.

Ваше предположение подтвердилось. Инкодеру хватило прямых указателей на
память.
Инкодер:
http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4095/

Вот что в итоге получилось:

void __fastcall BinStreamToStringBase64(TMemoryStream *p_Stream,
String &p_String)
{
base64<char> encoder; int _Status;
std::stringstream out;
ostreambuf_iterator<char> _Out = out.rdbuf();
encoder.put(reinterpret_cast<char *>(p_Stream->Memory),
reinterpret_cast<char *>(p_Stream->Memory) + p_Stream->Size, _Out,
_Status, base64<>::crlf());
p_String = out.str().c_str();
}
//--------------------------------------------------------------------------
--
void __fastcall StringBase64ToBinStream(String &p_String,
TMemoryStream *p_Stream)
{
base64<char> encoder; int _Status;
std::stringstream out;
ostreambuf_iterator<char> _Out = out.rdbuf();
encoder.get(p_String.c_str(), p_String.c_str() + p_String.Length(), _Out,
_Status);
p_Stream->Write(out.str().c_str(), out.str().size());
}

тепрерь картинки летают по сети в виде
VARIANT vIn;
vIn.vt = VT_BSTR;

Дмитрий


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какой контейнер посоветуете?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]