Как изменить вектор строк внутри лямбды - PullRequest
0 голосов
/ 22 октября 2018

Как передать вектор строк в лямбду и скопировать символы в вектор?

Здесь я собираю вектор как ссылку, но как только for_each завершен, все

строк вВектор "token" пуст, поэтому "final" строка пуста.

string encryption(string s) {

    string test;

    std::copy_if(s.begin(), s.end(), back_inserter(test), [](char c)
              {
                  if (isspace(c))
                  {
                      return false;
                  }

                  return true;
              });

    int size = s.size();
    float number = sqrt(size);

    int row = ceil(number);
    int col = floor(number);

    while ((row * col) < size)
    {
        row++;
    }

    std::vector<string> token;
    token.reserve(row);

    for_each(test.begin(), test.end(), [&](char c) mutable
             {
                 static int count = 0;
                 token[count%row] += c;
                 cout << token[count%row] << endl;
                 count++;
             });


    stringstream final;
    std::copy(token.begin(), token.end(), std::ostream_iterator<string>(final, " "));
    return final.str();
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

У вас здесь неопределенное поведение, так как

token.reserve(row);

выделяет достаточно памяти для хранения row элементов, но не меняет размер вектора.Следовательно, индексирование token внутри lamdba

token[count%row] += c;

является выходом за границы.Чтобы это исправить, измените вызов на std::vector::reserve на один std::vector::resize:

token.resize(row);
0 голосов
/ 22 октября 2018

Проблема здесь в том, что вы устанавливаете векторы емкость с помощью вызова reserve, но не его размер (который вы устанавливаете либо с помощью конструктор или resize).

Вкратце: ваш вектор пуст , и циклическая печать просто не будет повторяться из-за этого.

Что еще хуже, поскольку вектор пуст, все индексации в нем будут за пределами и приведут к неопределенному поведению .

Простое решениедолжен установить размер вектора:

std::vector<string> token(row);

или альтернативно

std::vector<string> token;
token.resize(row);  // Using *resize* to set the size
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...