преобразовать
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
преобразовать
Есть класс
StringArray
{
StringArray (const char* const * sData);
}
Есть контнейнер
deque <string> sCont;
Как подсунуть sCont в StringArray?
StringArray
{
StringArray (const char* const * sData);
}
Есть контнейнер
deque <string> sCont;
Как подсунуть sCont в StringArray?
-
- Уже с Приветом
- Posts: 176
- Joined: 21 Feb 2002 10:01
- Location: KZ -> KY -> WA
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
-
- Уже с Приветом
- Posts: 6789
- Joined: 01 Jun 2001 09:01
uniqueman wrote:опять подниму тему. Надо создать массив строк, размер которого известен только на ран тайме. Забыл как делается
Одномерный [x]:
type * array;
array = malloc (sizeof(type)*given_size);
Двумерный [x][y]:
type ** array;
array=malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
array[i]=malloc (sizeof(type)*given_size_y);
-
- Уже с Приветом
- Posts: 1787
- Joined: 27 Nov 2002 05:24
- Location: Sevastopol --> Ft. Lauderdale-->Boston-->Chicago
Одномерный [x]:
type * array;
array = malloc (sizeof(type)*given_size);
Двумерный [x][y]:
type ** array;
array=malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
array[i]=malloc (sizeof(type)*given_size_y);
Усе правильно. Только malloc возвращает void *, поэтому неплохо было бы его привести к нужным типам, а то некоторые комиляторы ругаются.
Code: Select all
// Двумерный [x][y]:
type ** array;
array=(type**)malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
array[i]=(type*)malloc (sizeof(type)*given_size_y);
Ну и напоследок, если товарищ сидит в C++ и ему нужны строки, то вместо type ему нужен будет char, и скорее всего, пользоваться он будет new и delete. Там приведение типов не нужно.
-
- Уже с Приветом
- Posts: 6906
- Joined: 20 Apr 1999 09:01
- Location: Seattle
-
- Уже с Приветом
- Posts: 6789
- Joined: 01 Jun 2001 09:01
-
- Уже с Приветом
- Posts: 6789
- Joined: 01 Jun 2001 09:01
Veselchak U wrote:Усе правильно. Только malloc возвращает void *, поэтому неплохо было бы его привести к нужным типам, а то некоторые комиляторы ругаются.Code: Select all
// Двумерный [x][y]:
type ** array;
array=(type**)malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
array[i]=(type*)malloc (sizeof(type)*given_size_y);
Ну и напоследок, если товарищ сидит в C++ и ему нужны строки, то вместо type ему нужен будет char, и скорее всего, пользоваться он будет new и delete. Там приведение типов не нужно.
Если быть такими вьедливыми, то неплохо еще учесть что malloc может 0 вернуть.
-
- Уже с Приветом
- Posts: 12072
- Joined: 17 Nov 2002 03:41
- Location: английская колония
-
- Уже с Приветом
- Posts: 1787
- Joined: 27 Nov 2002 05:24
- Location: Sevastopol --> Ft. Lauderdale-->Boston-->Chicago
CTAC_P wrote:Veselchak U wrote:Усе правильно. Только malloc возвращает void *, поэтому неплохо было бы его привести к нужным типам, а то некоторые комиляторы ругаются.Code: Select all
// Двумерный [x][y]:
type ** array;
array=(type**)malloc (sizeof(type *)*given_size_x);
for(i=0;i<given_size_x;i++)
array[i]=(type*)malloc (sizeof(type)*given_size_y);
Ну и напоследок, если товарищ сидит в C++ и ему нужны строки, то вместо type ему нужен будет char, и скорее всего, пользоваться он будет new и delete. Там приведение типов не нужно.
Если быть такими вьедливыми, то неплохо еще учесть что malloc может 0 вернуть.
Ага, а new -- еxception кинуть. А может и не кинуть. Въедливый я!
-
- Уже с Приветом
- Posts: 1787
- Joined: 27 Nov 2002 05:24
- Location: Sevastopol --> Ft. Lauderdale-->Boston-->Chicago
-
- Уже с Приветом
- Posts: 2013
- Joined: 16 Mar 2002 10:01
- Location: New York City
во как можно
vector <string> vec = {"test1", "test2"}
// делаем второй вектор
vector <char*> vec2;
// подправляем размер под первый
vec2.resize(vec.size());
// копируем
transform (vec.begin(), vec.end(), vec2.begin(), string_to_str);
// присваиваем...
char** labels = &vec2[0];
получаем массив строк.
vector <string> vec = {"test1", "test2"}
// делаем второй вектор
vector <char*> vec2;
// подправляем размер под первый
vec2.resize(vec.size());
// копируем
transform (vec.begin(), vec.end(), vec2.begin(), string_to_str);
// присваиваем...
char** labels = &vec2[0];
получаем массив строк.
-
- Уже с Приветом
- Posts: 3459
- Joined: 29 Oct 2002 20:08
- Location: US
uniqueman wrote:vector <char*> vec2;
...
// подправляем размер под первый
vec2.resize(vec.size());
...
// присваиваем...
char** labels = &vec2[0];
Неправильно. Вам никто не гарантирует, что в векторе все элементы лежат последовательно в памяти, как в массиве.
Замените vector на valarray хотя бы, если самому влом new/delete сделать (что может быть влом в контексте exceptions, например). Заодно и без resize обойдетесь.
И ещё, для флейма. transform - это зло.
-
- Уже с Приветом
- Posts: 394
- Joined: 12 Feb 2001 10:01
- Location: USA
Вы уверены? А вот Мейерс пишет по другому.шпиён wrote:Неправильно. Вам никто не гарантирует, что в векторе все элементы лежат последовательно в памяти, как в массиве.
Scott Meyers, Effective STL, Item 16 wrote:The elements in a vector are constrained by the C++ Standard to be stored in contiguous memory, just like an array, so if we wish to pass v to a C API that looks something like this.
void doSomething(const int* pInts, size_t numlnts);
we can do it like this:
doSomething(&v[0], v.size());
-
- Уже с Приветом
- Posts: 5552
- Joined: 20 Mar 2001 10:01
- Location: SFBA
-
- Уже с Приветом
- Posts: 11475
- Joined: 20 Nov 2000 10:01
- Location: Escondido, CA