Копирование вектора в std :: string - PullRequest
0 голосов
/ 01 мая 2019

Может кто-нибудь объяснить мне, почему код ниже не работает должным образом? Нет проблем с компиляцией, но вывод неправильный. Я думаю, проблема заключается в std::inserter.

Вывод программы:

Ожидаемый результат: 147497

#include <vector>
#include <string>
#include <algorithm>

int main()
{
  std::vector<char> vec;
  vec.push_back(1);
  vec.push_back(4);
  vec.push_back(7);
  vec.push_back(4);
  vec.push_back(9);
  vec.push_back(7);

  std::string test;

  if (!vec.empty())
  {
    std::copy(vec.begin(),vec.end(),std::inserter(test,std::end(test)));
   }
  std::cout << test;
}

1 Ответ

3 голосов
/ 01 мая 2019

Вы вставляете невизуальные управляющие символы ASCII в свой вектор.Вместо этого необходимо вставить визуальные символы ASCII:

// note the use of single quotes!
vec.push_back('1');
vec.push_back('4');
vec.push_back('7');
vec.push_back('4');
vec.push_back('9');
vec.push_back('7');

char(1) имеет числовое значение 1. char('1') имеет числовое значение 49 в ASCII.

Кроме того, поскольку вы вставляете символы в test в конце строки, рассмотрите возможность использования std::back_inserter вместо std::inserter (в любом случае вам не нужно проверять vec.empty() какстандартные алгоритмы прекрасно работают с диапазонами итераторов, где begin == end):

std::string test;
std::copy(vec.begin(), vec.end(), std::back_inserter(test));

Или просто используйте конструктор std::string, который принимает итераторы в качестве входных данных:

std::string test(vec.begin(), vec.end());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...