我需要将vector
的一部分char
s转换为int
。
如果我有将char向量转换为int
std::vector<char> // which contains something like asdf1234dsdsd
,我想从第4至第7位字符采取并将其转换成一个int。
职位总是已知的。
我该如何做最快的方法?
我试图使用全局副本,并得到了一个奇怪的答案。而不是2我得到了48.
我需要将vector
的一部分char
s转换为int
。
如果我有将char向量转换为int
std::vector<char> // which contains something like asdf1234dsdsd
,我想从第4至第7位字符采取并将其转换成一个int。
职位总是已知的。
我该如何做最快的方法?
我试图使用全局副本,并得到了一个奇怪的答案。而不是2我得到了48.
如果位置众所周知,你可以做这样的
int x = (c[4] - '0') * 1000 + (c[5] - '0') * 100 + (c[6] - '0') * 10 + c[7] - '0';
它比将它转换成字符串然后atoi它更快吗? –
是的,当你知道实际位置4..7时,这个速度可以达到最快 – unkulunkulu
1.以开始和结束(一个结束时间)索引的地址。
2.从中构建一个std :: string。
3.将其转换为std :: istringstream。
4.将字符串流中的整数从一个变量中提取出来。
(这可能是一个坏主意!)
你可以编码吗?这是什么意思“这可能是一个坏主意”?关于什么 ? –
的复制原因没有工作,可能是因为字节序,假设第一char
是最显著:
int x = (int(c[4]) << 24) + (int(c[5]) << 16) + (int(c[6]) << 8) + c[7]
对不起,我没有/不能在这个应用程序中使用移位。 –
你的意思是'(c [4] - '0')* 1000'等等? – unkulunkulu
它比将它转换成字符串然后atoi它更快吗? –
这是相当灵活的,虽然它不检查溢出或任何幻想这样的:
#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);
试试这个:
#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;
}
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
}
你总是可以做这样的事情'的std :: Stoi旅馆(的std :: string(STD ::开始(VEC)+ 4的std ::开始(vec)+ 8));'在C++ 11中。但确实涉及到创建该字符串。 – chris
这些位置是先验已知的(即它们总是字面上是4还是7),还是必须先找到序列中的数字? – unkulunkulu
是的,职位总是已知 –