3

Функция res() должна на вход принимать указатель на строку и возращать вектор с типом строки с размером длины передаваемой строки, а каждый элемент в векторе должен соответственно равен каждому символу строки.

Проблема: При запуске программа выдаёт следующую ошибку:

terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc


#include <iostream>
#include <string>
#include <vector>
#include <iterator>

using namespace std;

vector<string> res(string *p) {
    vector<string> vres;
    vres.reserve(p->size());
    for (int i = 0; i < p->size();++i) {
        vres.push_back(p[i]);
    }
    return vres;
}

int main(int argc, char* argv[])
{
    string word = "Hello";
    string * pword = &word;

    vector<string>result = res(pword);
    copy(result.begin(), result.end(), ostream_iterator<string>(cout, " "));

    return 0;
}
Harry
  • 221,325
lakvak
  • 145

1 Answers1

6

Стоп-стоп!

p->size() 

даст вам размер строки, а именно - 5. А дальше вы пытаетесь обращаться к несуществующим строкам p[i] (рассматривая p как массив строк, который на самом деле является просто указателем на одну строку) - есть ведь реально только одна строка - p[0], а остальное - указатели не пойми куда!

Если вы поясните, что вы *хотели**, будет можно посоветовать, как это сделать...

Если уж позарез именно вектор строк - то вот так лучше:

vector<string> res(const string& p) {
    vector<string> vres;
    vres.reserve(p.size());
    for(auto c: p) vres.emplace_back(1,с);
    return vres;
}

Только вот то же результат легко получить без вектора вообще:

int main()
{
    string word = "Hello";
    copy(word.begin(), word.end(), ostream_iterator<char>(cout, " "));
    return 0;
}
Harry
  • 221,325
  • Я хочу реализовать что-то похожее на функцию split() из Python – lakvak May 07 '20 at 10:24
  • То есть на вход ф-я принимает строку, а на выходе вектор, у которого каждый элемент соответственно равен каждому символу заданной строки – lakvak May 07 '20 at 10:25
  • Напомни, а у строк size и length - одно и то же? Или size и capacity? – Qwertiy May 07 '20 at 10:26
  • Тогда вам нужен скорее vector<char>. Но все то, что умеет vector<char>, умеет и string - просто нет никакого смысла в таком представлении... – Harry May 07 '20 at 10:27
  • 1
    @lakvak, vres.push_back(string() + (*p)[i]); – Qwertiy May 07 '20 at 10:27
  • @Qwertiy https://en.cppreference.com/w/cpp/string/basic_string/size – Harry May 07 '20 at 10:28
  • @Qwertiy Можете объяснить, почему вы добавили string()? И что он делает? – lakvak May 07 '20 at 10:30
  • p.s. Этот способ vres.push_back(string() + (*p)[i]); помог – lakvak May 07 '20 at 10:30
  • @lakvak, он создаёт новую пустую строку. Кстати, лучше создать один раз и использовать через переменную. Это я так char в string скастил. – Qwertiy May 07 '20 at 10:30
  • @Harry, о, классный вариант :) Я забыл, что у строки есть такой конструктор. – Qwertiy May 07 '20 at 10:32
  • 1
    @Qwertiy Это из серии "зачем просто, если можно сложно". Не надо вообще передавать указатель, достаточно константной ссылки... https://ideone.com/yBiR2r – Harry May 07 '20 at 10:33
  • @Harry, да с указателем понятно, просто я написал, как конкретную строку заменить, если остальное не трогать. А вот ни про emplace_back, ни про конструктор с числом повторов символа я не вспомнил. – Qwertiy May 07 '20 at 10:35
  • @Qwertiy Да эта функция - вообще лишняя сущность... Ведь string по сути не сто иное как вектор charов. – Harry May 07 '20 at 10:36
  • @Harry Гениально! Но хотелось бы дальше с этим вектором работать – lakvak May 07 '20 at 10:36
  • @Harry, ну может он упростил или ещё не закончил пример, а реально ему надо будет на слова разбить или по какому-то разделителю. – Qwertiy May 07 '20 at 10:36
  • Ну работайте, без вопросов... Я же код привел в вопросе, как сделать вектор строк. – Harry May 07 '20 at 10:41
  • @Harry Обнаружил проблему: при вводе строки с русскими буквами, выводит следующие: � � � � � � � � � � � � � � � � � � – lakvak May 07 '20 at 11:16
  • Это отдельный большой вопрос: https://ru.stackoverflow.com/questions/459154/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9-%D1%8F%D0%B7%D1%8B%D0%BA-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D0%B8 – Harry May 07 '20 at 11:29