c ++ int [] в строку - PullRequest
       37

c ++ int [] в строку

1 голос
/ 31 января 2012

У меня есть длинный массив целых чисел, которые необходимо преобразовать в строку.Длина массива составляет около 1000 - 10000 дюймов, а значение всех этих значений находится в диапазоне от 0 до 9.Есть ли быстрый и эффективный стандартный способ конвертировать весь массив int в строку?Это действительно должно быть сделано только с использованием стандартных библиотек.Спасибо.

Ответы [ 4 ]

7 голосов
/ 31 января 2012

Старый C ++:

std::string s; s.reserve(arr_len);
std::transform(arr, arr+arr_len, std::back_inserter(s),
               std::bind1st(std::plus<int>(), '0'));

C ++ 11:

 std::transform(arr, arr+arr_len, std::back_inserter(s),
               [](int c){return c+'0';});

Не то, чтобы 1 + '0' не обязательно было '1', но на практике вы можете смело предполагать это.

6 голосов
/ 31 января 2012

std::string или C string?

В любом случае для одного символа выполняется преобразование: char c = array[i]+'0';

Расширено это по всему массиву, и все готово.

1 голос
/ 31 января 2012

Это во многом зависит от семантики этих int с. Если они Дискретные значения (скажем, результаты броска 1000 - 10000 десятисторонних кости), то что-то вроде:

std::ostream&
operator<<( std::ostream& dest, std::vector<int> const& source )
{
    dest << '[';
    for ( std::vector<int>::const_iterator current = source.begin();
            current != source.end();
            ++ current ) {
        if ( current != source.begin() ) {
            dest << ", ";
        }
        dest << *current;
    }
    dest << ']';
    return dest;
}

может сделать трюк; Скорее всего, вы хотите забрать dest.width(), и установите его перед выводом каждого целого (или обработайте его как общее ширину и определите, сколько отступов вам нужно на int, и установите это перед выводом каждого int), и вы также можете вставить строку брейки.

Если, с другой стороны, ваш вектор является одним числом в базе 10, с одна цифра на int (в этом случае я бы рекомендовал использовать char, а не чем int), вы хотите что-то вроде:

std::ostream&
operator<<( std::ostream& dest, std::vector<int> const& source )
{
    std::vector<int>::const_reverse_iterator current 
        = std::find_if( source.rbegin(), source.rend(),
                        boost::bind( std::not_equal_to<int>(), _1, 0 ) );
    if ( current == source.rend() ) {
        dest << '0';
    } else {
        while ( current != source.rend() ) {
            dest << *current + '0';
            ++ current;
        }
    }
    return dest;
}

(Это для представления с прямым порядком байтов; для bigendian замените обратные итераторы с нормальными итераторами.)

Опять же, вы, вероятно, захотите обработать width() и fill(); обращение база будет значительно сложнее.

0 голосов
/ 31 января 2012

Допустим, arr[] - это ваш массив int. Тогда вы можете сделать:

int size = sizeof(arr) / sizeof(arr[0]); // get size of arr[]
char *intstr = new char[size+1]; // preallocate string 
intstr[size] = 0; // terminate string
for(int i = 0; i < size; i++)
{
    intstr[i] = '0' + arr[i];
}

Вот и все. Используются только стандарты ...

...