Какую структуру данных лучше выбрать?

373
20 декабря 2016, 22:35

Задача заключается в следующем: вводим текст с клавиатуры, на выходе должны получить предложения построчно, причем в порядке возрастания длины предложения. Какую структуру лучше выбрать, чтоб в последствии было легче написать алгоритм сортировки?( Опробовал варианты vector<vector<char>> и vector<string>, но туплю в написании алгоритма сортировки по длине строки.

Answer 1

Исполнение на ideone

#include <algorithm>
#include <iostream>
#include <vector>
int main() {
  std::vector<std::string> Vec = {
    "Мама",
    "Мама мыла раму",
    "Мама мыла"
  };
  std::sort(Vec.begin(),Vec.end(),[](const std::string& a, const std::string& b) {
    return a.size()<b.size();       
  });
  for(const auto &i:Vec) std::cout << i << std::endl;
  return 0;
}

Вывод:

Мама
Мама мыла
Мама мыла раму
Answer 2

Проще всего взять vector<string>. Для сортировки по длине используйте std::sort с компаратором.

vector<string> v;
// ...
sort(v.begin(), v.end(), 
     [](const string& l, const string& r) { return (l.length() < r.length()); });
Answer 3

Как я понимаю, то это задание на составление самостоятельно абстрактной структуры данных и ее сортировки.

В противном случае вы могли бы использовать контейнер std::multiset, в котором элементы сами бы упорядочивались по возрастанию длин предложений без всякой сортировки. Например,

#include <iostream>
#include <string>
#include <set>
int main()
{
    auto compare = [](const std::string &a, const std::string &b)
    {
        return a.length() < b.length();
    };
    std::multiset< std::string, decltype(compare)> sentences(compare);
    for (const std::string & s : { "123", "12", "12345", "1234", "1" })
    {
        sentences.insert(s);
    }
    for (const auto &s : sentences) std::cout << s << std::endl;
}

Вывод программы на консоль

1
12
123
1234
12345

Если вам надо разбить строку на предложения, то это можно сделать примерно следующим образом

#include <iostream>
#include <string>
#include <set>
int main()
{
    auto compare = [](const std::string &a, const std::string &b)
    {
        return a.length() < b.length();
    };
    std::multiset< std::string, decltype(compare)> sentences(compare);
    std::string text("I'm learning C++... How to write the program? I did it!");
    for (std::string::size_type pos = 0; pos != text.size(); )
    {
        auto last_pos = text.find_first_of(".?!", pos);
        if (last_pos == std::string::npos)
        {
            sentences.insert(text.substr(pos));
            pos = text.size();
        }
        else
        {
            while (last_pos < text.size() && text[last_pos] == '.') ++last_pos;
            sentences.insert(text.substr(pos, last_pos - pos + 1));
            while (++last_pos < text.size() &&
                (text[last_pos] == ' ' || text[last_pos] == '\t'));
            pos = last_pos;
        }
    }
    for (const auto &s : sentences) std::cout << s << std::endl;
}

Вывод программы на консоль:

I did it!
I'm learning C++...
How to write the program?

Использовать для такой задачи контейнер std::vector не эффективно, так как он будет постоянно перераспределять память при добавлении нового элемента, а затем еще потребуется сортировка.

Если говорить о собственноручно написании структуры данных для хранения предложений, то постройте односвязный список. В него также добавляйте новые элементы в порядке возрастания ключей.

READ ALSO
Как сделать сдвиг с запоминанием?

Как сделать сдвиг с запоминанием?

Как сделать сдвиг значения? У меня переменная Sifra, и при нажатии на оду из двух клавиш, происходит перезапись значения (то есть нажал раз, у меня...

406
Не полное разложение на множители

Не полное разложение на множители

Написал программу, которая бы разлагала любое целое число на множители

348
Заменить символ &#39;/&#39; на &ldquo;\\&rdquo;

Заменить символ '/' на “\\”

Нужно в строке заменить все символы / на \\Делал следующим образом:

315
Вопрос по шаблонным методам C++ [требует правки]

Вопрос по шаблонным методам C++ [требует правки]

Не получается пройти тестовый вопросПодскажите пожалуйста:

365