Вектор в строку С++

257
17 августа 2018, 00:40

Как превратить вектор в число и перевернуть его на языке С++? В JS это делается вот так:

let num = Number([1, 3, 4, 5].reverse().join(''))
consolt.log(num) // 5431

То есть получается именно число. А для С++? Как например и вектора

vector<int> num = {1, 3, 4, 5};

Надо получить число

int res = 5431;

Числа в исходном векторе ТОЛЬКО однозначные.

Answer 1

https://ideone.com/my3zsy

#include <iostream>
#include <vector>
#include <sstream>
#include <iterator>
#include <algorithm>
using namespace std;
int main()
{
  vector <int> num = {1, 3, 4, 5};
  stringstream ss;
  copy(num.rbegin(), num.rend(), ostream_iterator<int>(ss, ""));
  int res;
  ss >> res;
  cout << res;
  return 0;
}
Answer 2

Например, так :)

Вариант, работающий даже с многозначными числами:

string revs(const vector<int>&n)
{
    return accumulate(n.rbegin(),n.rend(),r,
              [](string r, int x) { return r += to_string(x); } );
}

Если эти многозначные числа тоже надо развернуть - ну, это труднее:

string revs(const vector<int>&n)
{
    string r;
    return accumulate(n.rbegin(),n.rend(),r,
              [](string r, int x) {
                  string t = to_string(x);
                  reverse(t.begin(),t.end());
                  return r += t; } );
}

См. работающую программу здесь.

Ну, а если нужно число (хотя в заголовке вы пишете "в строку") - то можно просто применить к полученной строке stoll.

Можно и проще, но непонятно, как именно обрабатывать многозначные числа. Если уточните, во что должен превратиться вектор, скажем, {1, 23, 45670, 5} - то поговорим :)

Для только однозначных чисел идеален как в смысле простоты, так и производительности метод @ARHovsepyan, который я, впрочем, переписал бы в одну строку:

int revs(const vector<int>&n)
{
    return accumulate(n.rbegin(),n.rend(),0,
              [](int res, int x) { return res = res*10+x; } );
}

в основном из-за того, чтов таком случае он применим практически к любому контейнеру (кроме forward_list и всех unordered, причем к последним - просто потому, что понятие порядка у них отсутствует).

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

Answer 3

Если в последовательности только одназначные числа, то одни из многих вариантов

вариант с вектором:

vector<int> v{1,2,3,4,5};
int res{};
for (int i : v) {
    static int k = 1;
    res += i * k;
    k *= 10;
}

Но в C++ есть оптимизированный для численных методов очень удобный класс valarray Вариант с ним будет короче и быстрее:

valarray<int> v1{1,2,3,4,5};
int res = valarray<int>(v1.apply([](int i)
{ static int k = 1; i *= k; k*= 10; return i;})).sum();

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

READ ALSO
Qt, событие на пункте QMenuBar

Qt, событие на пункте QMenuBar

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

175
Есть ли ресурс для практики на C++? [закрыт]

Есть ли ресурс для практики на C++? [закрыт]

Учусь писать на С++, и переодически, пройдя какую-то тему, приходится просто оставлять её в голове без практикиВ силу нехватки воображения,...

190
Страности с типом int в C++ [закрыт]

Страности с типом int в C++ [закрыт]

Начнём с того, что я ещё совсем "зелёный" в программированииИ тут на днях я баловался с С++

154
Динамическе и статические n-мерные массивы в С++

Динамическе и статические n-мерные массивы в С++

Похоже я не совсем понимаю что из себя представляют двумерные (n-мерные) массивы в C++, чем они являются для оперативной памяти и чем двумерный...

152