奇怪:vector <int>到int C ++

时间:2016-03-02 17:10:03

标签: c++ vector

我正在尝试将int的向量转换为int。这就是我的工作方式:

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

uint32_t toInt(vector<int> v)
{
    uint32_t x=0;
    for(int i=0 ; i<v.size() ; i++)
        x+=v[i]*pow(10, v.size()-1-i);

    return x;
}

int main()
{
    vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    cout << toInt(v) << endl; // displays: 123456787 (???)
}

该程序应输出123456789,但我有12345678(!)7(!)。

我在Code :: Blocks 13.12上使用 GCC(tdm-1)4.7.1

有人对此问题有解释,并有解决方法吗? 谢谢。

3 个答案:

答案 0 :(得分:4)

我无法想象它会导致您引用的问题,但是您进行转换的方式非常难看,涉及浮点数学,所以它可能导致某些程度的某些程度的不准确例。

您可以通过略微不同的方式消除该特定问题。例如:

int toInt(vector<int> const &v) { // pass by reference to avoid copying
    int ret = 0;
    for (int i=0; i<v.size(); i++)
        ret = 10 * ret + v[i];
    return ret;
}

或者,您可以使用标准库为您处理更多工作:

int toInt(vector<int> const &v) { // pass by reference to avoid copying
    return std::accumulate(v.begin(), v.end(), 
               0, 
               [](int v, int digit) { return 10 * v + digit; });
}

当然,这仍然限于适合int的值 - 例如,对于典型的32位int,大约需要20亿。

答案 1 :(得分:1)

这个我无法重现的确切原因,但一个简单的解决方案是不使用pow

#include <iostream>
#include <vector>

uint32_t toInt(std::vector<int> v)
{
    uint32_t x=0;
    for(size_t i=0 ; i<v.size() ; i++)
    {
        x*=10; 
        x+=v[i];
    }
    return x;
}

int main()
{
    std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::cout << toInt(v) << std::endl; 
}

pow

pow旨在计算浮点数的幂,因此它会做一些复杂而昂贵的事情。如果你只是将整数的幂加到整数,那么乘法几乎总是更快。

powstd::pow略有不同。 std::pow是一个模板化的野兽,最终会调用pow,但只有在使用输入数据类型播放游戏后才会导致奇怪的结果。举个例子,这个提问者遇到了什么:C++ pow unusual type conversion

这只是using namespace std;可以为您提供的众多方式之一。您可能对编译器选择的pow感到惊讶。在此处阅读更多内容:Why is "using namespace std" considered bad practice?

答案 2 :(得分:0)

您的代码在我的计算机上正常运行

uint32_t toInt(vector<int> v)
{
    uint32_t x=0;
    for(int i=0 ; i<v.size() ; i++)
        x+=v[i]*pow(10, v.size()-1-i);

    return x;
}
int main(){
    int myints[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    vector<int> v (myints, myints + sizeof(myints) / sizeof(int) );
    cout << toInt(v) << endl;
}

执行如下:

  

./测试   123456789   退出代码:0

这台计算机已经老了并运行了c ++ 98,但我没有看到你的程序无法正常工作的原因。检查你的记忆是否有溢出。