2013-04-30 5 views
0

Я возился с ostream_iterator и понял, что при указании разделителя он выводит слишком много. Поэтому вместо этого я пошел с ostringstream, поэтому я могу изменить строку перед ее выходом. Но потом я понял, что должен просто использовать string. Одна проблема, однако, с помощью следующего кода:Интересный std :: copy from std :: vector to std :: string поведение

кода

#include <iostream> 
#include <iterator> 
#include <vector> 
#include <sstream> 

int main() 
{ 
    std::vector<int> v(10); 
    std::fill(v.begin(), v.end(), 42); 

    std::string s(" ", v.size()); 
    std::copy(v.begin(), v.end(), s.begin()); 
    std::cout << s << std::endl; 

    return 0; 
} 

выход:

выход:

********** 

Однако с

std::vector<int> v(10); 
std::fill(v.begin(), v.end(), 42); 

std::ostream_iterator<int> osi(oss); 

std::copy(v.begin(), v.end(), osi); 

std::cout << oss.str() << std::endl; 

Выход

выхода

42424242424242424242 

Очевидно, что это преобразование числа в ASCII представление. Он просто делает char cast, или это побочный эффект сложных внутренних элементов STL? Независимо от того, как я могу изменить его на выходные числа вместо asteriks?

+1

изменить его, чтобы получить что? – Jack

+0

Что вы хотите, чтобы результат был? –

+0

'int' и' char' - это разные вещи, вы знаете. –

ответ

1

Это просто скопировав номер 42 от int к любому типу символа используются в базовом представлении вашей строки (вероятно char), усечения любых бит, которые не будут соответствовать (в вашем случае, не требуется никакое усечения). Затем сохраняет этот тип char в каждый элемент строки. Когда строка печатается, она просто печатает ASCII (или любой другой набор символов вашей архитектуры) представления 42.

Если вы хотите напечатать номер 42 в качестве строки 42 на своем терминале, вам нужно использовать отформатированный вывод для сделайте дисплей. Ваш подход ostream_iterator представляется здесь разумным подходом.

Смежные вопросы