首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ --如何创建一个向量,其中每个元素都是输入字符串中的一个数字?

C++ --如何创建一个向量,其中每个元素都是输入字符串中的一个数字?
EN

Stack Overflow用户
提问于 2017-05-28 14:02:58
回答 2查看 1.8K关注 0票数 1

我试图编写一个函数,该函数接受用户输入的数字,例如830948234681764,并创建一个向量,其值与输入的完整长度相同,并为每个数字创建一个元素:

输入: 830948234681764

  • 指标值
    • 0-8
    • 1-3
    • 2-0
    • 3-9
    • 4-4
    • 5-8

我遇到了一些问题,用数学来提取单个数字,因为序列可能有几千个字符长。

然而,使用字符串意味着向量的每个元素都变成了数字的ascii代码,我不知道如何将它们转换为原始值。

下面是代码的主要内容:

代码语言:javascript
运行
复制
    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++都不熟悉,并且有点搞不清这个问题。任何帮助都将不胜感激!

干杯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-28 14:34:56

一种方法是将连续的数字推入一个初始的空向量。

代码语言:javascript
运行
复制
 std::string s = "07563157289";

 std::vector<int> v;
 for (auto c : s) {                // for each char in s
    v.push_back(c - '0');
 }

另一种方法是首先创建大小合适的向量,然后使用循环遍历索引来填充向量。

代码语言:javascript
运行
复制
 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)来查看编译器生成的代码。

胜利者是

代码语言:javascript
运行
复制
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台机器指令。

代码语言:javascript
运行
复制
.L61:
    cmpq    %r13, %rax
    je  .L66
    movl    $0, (%r12,%rax,4)
    incq    %rax
    jmp .L61

对于“带有大小的声明向量+带索引的循环”版本(第一个前aequo),也会生成相同的代码。

使用transform+back_inserter要长2倍,并且需要对emplace_back的辅助过程(大约50条指令)进行昂贵的调用。

代码语言:javascript
运行
复制
.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
票数 9
EN

Stack Overflow用户

发布于 2017-05-28 14:45:24

您可以避免循环并使用std::transform

代码语言:javascript
运行
复制
#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'; });
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44228121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档