Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Дописывание данных в массив


Автор: Nikita_85 3.8.2007, 14:21
Здрасте!
Поскажите, пожалуйста, есть ли в C++ функция, которая позволяет дописывать данные в массив из другого массива?

Заранее спасибо!

Автор: FiMa1 3.8.2007, 14:28
а что за массивы, если массивы char, то strcat, к примеру. А так самому можно написать функцию..

Автор: Lazin 3.8.2007, 14:29
если в С++ то юзай контейнеры, например vector, если всё таки нужно использовать массив, то realloc, затем memcpy 

Автор: bsa 3.8.2007, 14:31
да. http://www.sgi.com/tech/stl/Vector.html

Автор: FiMa1 3.8.2007, 14:47
ну или вот кустарная версия конкатенации двух массивов целых значений. Склеивание, начиная с некоторой  позиции конечного массива. smile .
Код
#include <iostream>

void intcat(int arr1[], int arr2[], int arr1len, int arr2len, int indx)
{
    int i, j;

    for(i = indx, j = 0; i < arr1len; i++)
        arr1[i] = arr2[j++];
}

int main()
{    
    int arr1[6] = { 1, 2, 3 };
    int arr2[3] = { 4, 5, 6 };

    const int ARR1LEN = sizeof(arr1) / sizeof(int);
    const int ARR2LEN = sizeof(arr2) / sizeof(int);

    intcat(arr1, arr2, ARR1LEN, ARR2LEN, 3);
    
    for(int i = 0; i < ARR1LEN; i++)
        std::cout << arr1[i];
}

Автор: Любитель 3.8.2007, 17:34
FiMa1, неэффективно. memcpy тогда уж smile

Автор: Xenon 3.8.2007, 23:37
Можно даже не изобретать велосипед smile
Код

const int SIZE = 4;
const int SIZE2 = 8;

int main(int argc, char argv[]) 
{
    int arr [SIZE] = { 5,6,7,8 };
    int arr2 [SIZE2] = { 1,2,3,4 };
    std::merge(arr, arr + SIZE, arr2, arr2 + SIZE, arr2);
    std::copy( arr2, arr2 + SIZE2, std::ostream_iterator<int>(std::cout, " ") );
    return 0;
}

Автор: Xenon 4.8.2007, 02:22
FiMa1, кстати по поводу твоего кода. Чего мешает делать хотя бы так smile :
Код

void intcat(int arr1[], int arr2[], int arr1len, int arr2len, int indx)
{
   for(int i = indx, j = 0; i < arr1len; ++i, ++j)
        arr1[i] = arr2[j];
}

Автор: Nikita_85 6.8.2007, 15:37
Всем спасибо за советы!

Дело в том, что дописывание в массив происходит внутри цикла while. Поэтому в каждом круге некоторая информация должна записываться в выходной массив. Как можно это сделать? (ведь в приведенных выше советах циклы for с переменной i и функция memcpy не подходят, так как выходной массив тогда будет переписываться каждый раз)

Автор: NoNo 6.8.2007, 16:45
Лудше используй vector....
а так перераспределяй в каждом круге памятья по новой

Автор: Nikita_85 7.8.2007, 08:39
Прошу прощения за неумный вопрос, как распределять память? Может об этом можно почитать где-нибудь?

Автор: Xenon 7.8.2007, 14:47
Nikita_85, ну я думаю человек имел ввиду выделение блока памяти большего, чем был, копирование информации из старого блока в новый, удаление старого.

Автор: Rockie 9.8.2007, 16:05
Цитата(Nikita_85 @  7.8.2007,  08:39 Найти цитируемый пост)
Прошу прощения за неумный вопрос, как распределять память?

Это лучше на менеджер памяти переложить.

Цитата(Xenon @  7.8.2007,  14:47 Найти цитируемый пост)
выделение блока памяти большего, чем был, копирование информации из старого блока в новый, удаление старого.

Это http://forum.vingrad.ru/forum/topic-121297/hl/%25D0%25B7%25D0%25B0%25D0%25BA%25D0%25BE%25D0%25BC%25D0%25BC%25D0%25B5%25D0%25BD%25D1%2582%25D0%25B8%25D1%2580%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BB+%25D0%25BA%25D0%25BE%25D0%25B4/0.html, но вряд ли нужно..


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)