我正在尝试编写一个用户输入数字的函数,例如830948234681764,并创建一个具有与该输入的全长一样多的值的向量,并为每个数字创建一个元素:
输入:830948234681764
等等
我有使用数学来提取单个数字的问题,因为序列必须长达数千个字符.
但是,使用字符串意味着向量的每个元素都成为数字的ascii代码,我不知道如何将它们转换为原始值.
这是代码的内容:
string s = "12345"
int size = s.length();
std::vector <double> v (size);
for (int i = 0; i < size; i++) {
v[i] = s[i];
}
Run Code Online (Sandbox Code Playgroud)
无论是之后将数组从ascii转换为int值,还是将每个字符转换为int,然后将其转换为向量,我都是C++的新手并且有点陷入困境.任何帮助将非常感激!
干杯
一种方法是将连续数字推入最初为空的向量.
std::string s = "07563157289";
std::vector<int> v;
for (auto c : s) { // for each char in s
v.push_back(c - '0');
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是首先创建具有正确大小的向量,然后使用索引上的循环来填充向量
unsigned size = s.size();
std::vector<int> v(size);
for (unsigned i=0; i<size; ++i) { // for i in {0,1, ..size-1}
v[i] = s[i] - '0';
}
Run Code Online (Sandbox Code Playgroud)
使用大字符串会稍微提高效率,因为它避免了底层数组(隐藏)重新分配的成本.
编辑:我编译了几个版本(使用g ++ --std = c ++ 11 -Os -S)来查看编译器生成的代码.
获胜者是
std::vector<int> digits_transform_alloc(const std::string &s)
{
std::vector<int> v(s.size());
std::transform(s.begin(), s.end(),
v.begin(),
[](char ch) { return ch - '0';});
return v;
}
Run Code Online (Sandbox Code Playgroud)
向量首先分配到正确的大小,然后填充值.循环仅为5机器指令.
.L61:
cmpq %r13, %rax
je .L66
movl $0, (%r12,%rax,4)
incq %rax
jmp .L61
Run Code Online (Sandbox Code Playgroud)
并且为"声明向量大小+用于循环索引"版本(第一个例外)生成相同的代码.
使用transform + back_inserter要长2倍,并且需要对emplace_back进行昂贵的辅助过程调用(大约50条指令)
.L48:
cmpq %r12, %rbp
je .L54
movsbl 0(%rbp), %edx
leaq 12(%rsp), %rsi
movq %rbx, %rdi
subl $48, %edx
movl %edx, 12(%rsp)
.LEHB2:
call _ZNSt6vectorIiSaIiEE12emplace_backIIiEEEvDpOT_
.LEHE2:
incq %rbp
jmp .L48
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |