我试图编写一个函数,该函数接受用户输入的数字,例如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];
}无论是以后将数组从ascii转换为int值,还是将每个字符转换为int,然后再将其注入向量,我对C++都不熟悉,并且有点搞不清这个问题。任何帮助都将不胜感激!
干杯
发布于 2017-05-28 14:34:56
一种方法是将连续的数字推入一个初始的空向量。
std::string s = "07563157289";
std::vector<int> v;
for (auto c : s) { // for each char in s
v.push_back(c - '0');
}另一种方法是首先创建大小合适的向量,然后使用循环遍历索引来填充向量。
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';
}由于它避免了底层数组(隐藏的)重新分配的成本,因此它对大型字符串的效率略高一些。
编辑:我编译了几个版本(使用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;
}首先将向量分配给适当的大小,然后用值填充。该循环仅为5台机器指令。
.L61:
cmpq %r13, %rax
je .L66
movl $0, (%r12,%rax,4)
incq %rax
jmp .L61对于“带有大小的声明向量+带索引的循环”版本(第一个前aequo),也会生成相同的代码。
使用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发布于 2017-05-28 14:45:24
您可以避免循环并使用std::transform。
#include <algorithm>
#include <vector>
#include <iterator>
#include <string>
//...
std::string InputSequence;
std::vector <double> MainVector;
//...
std::transform(InputSequence.begin(), InputSequence.end(),
std::back_inserter(MainVector), [](char ch) { return ch - '0'; });https://stackoverflow.com/questions/44228121
复制相似问题