2012-06-28 60 views
-1

我需要将vector的一部分char s转换为int
如果我有将char向量转换为int

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

,我想从第4至第7位字符采取并将其转换成一个int。
职位总是已知的。

我该如何做最快的方法?

我试图使用全局副本,并得到了一个奇怪的答案。而不是2我得到了48.

+0

你总是可以做这样的事情'的std :: Stoi旅馆(的std :: string(STD ::开始(VEC)+ 4的std ::开始(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.从中构建一个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 
}