【问题标题】:Splitting vector ints into an int of those digits将向量整数拆分为这些数字的整数
【发布时间】:2018-05-24 05:45:52
【问题描述】:

有没有办法做到这一点?基本上,我正在尝试将 int 的数字放入向量的过程,而不是相反。这样,如果vectorrandom 值为5、6、7...我可以转换为值为“567”的int。这甚至可能或可行吗?

【问题讨论】:

  • 一切皆有可能,你尝试了什么?
  • 这是作业吗?

标签: c++ vector int


【解决方案1】:

以下函数可用于将整数向量转换为单个整数。

std::string Join(const std::vector<int>& intVector)
{
    std::stringstream ss;
    for (const auto& element : intVector)
    {
        ss << element;      
    }
    return ss.str();
}

在上面的实现中,使用了基于范围的 for 循环,因为此功能在 c++ 11 中可用。您可以使用普通的 for 循环。 要将返回的字符串值转换为整数,可以使用 std::stoi 算法 (c++ 11) 或 atoi 函数。

【讨论】:

  • 非常低效的解决方案。为什么首先使用字符串,而不是仅仅将前一个结果乘以 10 并添加下一个数字?
  • 我同意你的看法。但是,如果 int 向量包含不适合整数数据类型的元素,则乘以 10 并添加下一个数字将失败。
  • 在任何情况下都应该检查。在转换为 int 的阶段,它也会因字符串而失败。
  • 在乘法和加法的情况下,我们还需要做一件事,我们需要检查向量中的每个元素的长度是否为1。否则,结果将不正确。
  • 这个问题明确地谈到了数字向量。如果输入不是数字,则无效。不管使用什么方法。
【解决方案2】:
int Join(const std::vector<int>& intVector)
{
    unsigned long sum = 0;
    for (const int& i : intVector)
    {
        sum = (sum << 3) + (sum << 1); // sum*8 + sum*2 = sum*10;
        sum += i;
    }
    return sum;
}

【讨论】:

  • 我想乘以 10 会被编译器优化。此外,您将总数累积在 unsigned long 中,但以 int 形式返回。
【解决方案3】:

是的,这是可以实现的,只要确保向量长度在您的数据类型范围内,例如 int 64bit 或 int 32bit。

阅读更多关于Data type ranges的信息

伪代码

vector<int> vec{5, 6, 7};
int num = 0;
for(int x : vec)
    num = num*10 + x;
cout<<num; // 567

Ideone

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2011-05-11
    • 2019-10-10
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多