Есть вектор длины n
и строка длины m
, содержащая только цифры. Необходимо в вектор записывать числа с максимум k
цифрами, содержащиеся в строке, с конца. Например:
std::vector<unsigned int> v(3); // n = 3
std::string s = "52152000535"; // m = 11 (без `\n`)
size_t k = 4;
// в итоге в векторе должно быть следующее
v[0] == 535; // т.е. начальные нули отбрасываются
v[1] == 5200;
v[2] == 521; // т.е. если цифр не хватает, то берём всё, что осталось
Все параметры правильно согласованны, т.е. конфликтов нет, строка содержит исключительно цифры, нули не могут идти первыми.
У меня есть решение вида "для каждого элемента вектора берём нужную подстроку с конца с помощью substr()
и преобразуем её в число с помощью stoll()
", но решение использует несколько счётчиков и вероятность багов очень высока. Было бы прекрасно иметь решение с помощью итераторов и STL алгоритмов.
Прямолинейный подход к решению может выглядеть следующим образом.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int main()
{
size_t n = 3;
size_t k = 4;
std::vector<unsigned int> v(n);
std::string s( "52152000535");
size_t m = s.size();
for (size_t i = 0; i < n && m != 0; i++ )
{
size_t length = std::min(k, m);
m -= length;
v[i] = static_cast<unsigned int>(std::stoul(s.substr(m, length)));
}
for (auto x : v) std::cout << x << ' ';
std::cout << std::endl;
}
Вывод программы на консоль
535 5200 521
Нет никакой необходимости здесь искусственно прилеплять алгоритмы, тем более, если такое решение с алгоритмами, если оно существует, не очевидно.
Без STL, с одним счётчиком
std::vector<unsigned int> v;
std::string s = "52152000535";
size_t k = 4;
size_t str_size = s.size();
int i;
for (i = str_size - k; i > 0; i -= k)
v.push_back(std::stoi(s.substr(i, k)));
v.push_back(std::stoi(s.substr(0, i+k)));
Не очень понятно, почему вы используете std::stoll хотя вектор содержит unsigned int
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Задан упроядоченый vector из double, где каждый элемент представляет собой конец отрезкаНапример, {1,3,5,6,9} -- означает, что существуют следующие отрезки:...
Недавно начал изучать перегрузку операторовПытаюсь перегрузить оператор * как пересечение множеств, но не могу понять как в данном случае...
Архивы форматов rar,zip, необходимо: распаковывать архив, получать определенный фаил из архива, получать древо каталогов и список всех файлов...
Я новичок в этой темеХотел попробовать сделать одновременную работу нескольких функций