C++ 奇怪:向量<;int>;到int C++;

C++ 奇怪:向量<;int>;到int C++;,c++,vector,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

我正在尝试将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 (???)
}
#包括
#包括
#包括
使用名称空间std;
uint32_t toInt(向量v)
{
uint32_t x=0;

对于(int i=0;i我无法想象它会导致您所引用的问题,但是您进行转换的方式非常糟糕,并且涉及浮点数学,因此在某些情况下可能会导致至少某种程度的不准确

您可以通过稍微不同地执行转换来消除该特定问题。例如:

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-const&v){//通过引用传递以避免复制
int-ret=0;

对于(int i=0;i我无法想象它会导致您所引用的问题,但是您进行转换的方式非常糟糕,并且涉及浮点数学,因此在某些情况下可能会导致至少某种程度的不准确

您可以通过稍微不同地执行转换来消除该特定问题。例如:

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-const&v){//通过引用传递以避免复制
int-ret=0;

对于(int i=0;i您的代码在我的计算机上运行良好

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;
}
uint32\u t toInt(向量v)
{
uint32_t x=0;

对于(int i=0;i您的代码在我的计算机上运行良好

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;
}
uint32\u t toInt(向量v)
{
uint32_t x=0;

对于(int i=0;i我无法再现其确切原因,但一个简单的解决方案是不使用
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; 
}
#包括
#包括
uint32_t toInt(标准::向量v)
{
uint32_t x=0;

对于(size_t i=0;i的确切原因我无法重现,但一个简单的解决方案是不使用
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; 
}
#包括
#包括
uint32_t toInt(标准::向量v)
{
uint32_t x=0;

对于(size\u t i=0;我打赌这与可用的
pow
重载有关。了解GCC版本不会有什么坏处-您通常还应该包括所有这些信息(包括所有包含!!)在你的问题中。离题性能说明:
pow
被设计用来处理像3.14到1/2.78的幂的奇怪的东西。如果你是
pow
ing整数,它几乎总是更快的乘法。在这种情况下,
x*=10;x+=v[i];
取代
x+=v[i]*pow(10,v.size()-1-i);
(但需要在
的主体周围加括号以表示
)`我打赌这与可用的
pow
重载有关。知道你的GCC版本不会有什么坏处-你通常还应该包括所有这些信息(包括所有包含!!)在你的问题中。离题性能说明:
pow
被设计用来处理像3.14到1/2.78的幂的奇怪的东西。如果你是
pow
ing整数,它几乎总是更快的乘法。在这种情况下,
x*=10;x+=v[i];
取代
x+=v[i]*pow(10,v.size()-1-i);
(但需要在
的主体周围用括号括起来表示
)。`谢谢,第一个对我来说很好!我会记住,即使我仍然不理解错误发生的原因……它失败的原因是因为浮点数数学(pow是浮点数)在计算机上是不精确的谢谢,第一个对我很好!我会记住,即使我仍然不明白为什么会发生错误…它失败的原因是因为计算机上的浮点数数学(pow是浮点)不精确