C++ 奇怪:向量<;int>;到int C++;
我正在尝试将int的向量转换为int。这是我如何进行的: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
#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是浮点)不精确