2012-06-28 4 views
-1

Мне нужно преобразовать часть vector s из char s в int.
Если у меня естьпреобразовать вектор char в int

std::vector<char> // which contains something like asdf1234dsdsd 

и я хочу взять символы с 4-го до 7-е место и превратить его в междунар.
Позиции всегда известны.

Как мне это сделать быстрее всего?

Я попытался использовать глобальную копию и получил странный ответ. Вместо 2 я получил 48.

+0

Вы всегда можете сделать что-то вроде 'станд :: стои (станд :: строки (станд :: начать (VEC) + 4, зЬй :: начать (vec) + 8)); 'в C++ 11. Тем не менее, это связано с созданием этой строки. – chris

+0

- эти позиции известны априори (то есть они всегда буквально 4 и 7), или вам нужно сначала найти номер в последовательности? – unkulunkulu

+0

Да, позиции всегда известны –

ответ

3

Если позиции известно, что вы можете сделать это, как этот

int x = (c[4] - '0') * 1000 + (c[5] - '0') * 100 + (c[6] - '0') * 10 + c[7] - '0'; 
+0

Является ли это более быстрым способом, чем преобразовать его в строку, а затем atoi? –

+0

Да, это так же быстро, как вы можете получить, когда знаете фактические позиции 4..7 – unkulunkulu

1

1.Введите адрес индекса начала и конца (один за конец).

2.Construct std :: string из него.

3. Внесите его в std :: istringstream.

4. Извлеките целое число из строки в переменную.

(Это может быть плохой идеей!)

+0

Можете ли вы его закодировать? Что значит «это может быть плохая идея»? о чем ? –

2

Причина копирования не работает, вероятно, из-за байтов, предполагая, что первый char является наиболее значимым:

int x = (int(c[4]) << 24) + (int(c[5]) << 16) + (int(c[6]) << 8) + c[7] 
+0

Извините, я не использую/не могу использовать перенос в этом приложении. –

+0

Вы имеете в виду '(c [4] - '0') * 1000' и ​​т. Д.? – unkulunkulu

+0

Является ли это более быстрым способом, чем преобразовать его в строку, а затем atoi? –

2

Это довольно гибкая, хотя он не проверяет переполнение или что-нибудь фантазии в этом роде:

#include <algorithm> 

int base10_digits(int a, char b) { 
    return 10 * a + (b - '0'); 
} 

int result = std::accumulate(myvec.begin()+4, myvec.begin()+8, 0, base10_digits); 
0

Попробуйте это:

#include <iostream> 
#include <vector> 
#include <math.h> 

using namespace std; 

int vtoi(vector<char> vec, int beg, int end) // vector to int 
{ 
    int ret = 0; 
    int mult = pow(10 , (end-beg)); 

    for(int i = beg; i <= end; i++) { 
    ret += (vec[i] - '0') * mult; 
    mult /= 10; 
    } 
    return ret; 
} 

#define pb push_back 

int main() { 
    vector<char> vec; 
    vec.pb('1'); 
    vec.pb('0'); 
    vec.pb('3'); 
    vec.pb('4'); 

    cout << vtoi(vec, 0, 3) << "\n"; 

    return 0; 
} 
-1
long res = 0; 

for(int i=0; i<vec.size(); i++) 
{ 
    res += vec[i] * pow (2, 8*(vec.size() - i - 1)); // 8 means number of bits in byte 
}