我目前正在编写一个小程序,用于根据地理坐标(纬度和经度)计算两个城市之间的距离(我认为这与谷歌地图的方式相同)但仅限于数量有限的城市。
我的程序使用文件文本中的getline获取城市的名称,纬度和经度。例如,巴黎将是"巴黎48.51.12 2.20.5"。
然后,我解析该行得到a)名称,b)纬度(输入为angle.minutes.seconds),c)经度。我解析纬度和经度,得到一个带有3个相应数字的向量,但保存为字符串。
下一步是将字符串向量转换为int向量。我找到了一个非常简洁的方法:
int strtoint(string str)
{
int i=0;
if(!(istringstream(str)>>i)) i=0;
return i;
}
至于为什么我不使用 stoi 或 atoi ,我无法让我的编译器(MingW,在Code :: Blocks 13.12中)理解它们,所以也许我错过了一步。
然而,当我尝试将它与我的矢量一起使用时,它会进入一个无限循环,我不明白为什么:
for(int unsigned i=0; i<latitude.size();i++)
{
cout<<latitude[i]<<endl;
i_latitude[i]=strtoint(latitude[i]);
}
纬度为字符串向量,i_latitude为int向量。
以下适用于我:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int strtoint(string str)
{
int i=0;
if(!(istringstream(str)>>i)) i=0;
return i;
}
int main()
{
string str="45";
int nbr=strtoint(str);
cout<<nbr<<endl<<endl; //shall return 45 as an integer
string foo [3]= {"45", "32", "15"};
int ifoo [3];
for(int i=0;i<3;i++)
{
ifoo[i]=strtoint(foo[i]);
cout<<ifoo[i]<<endl; //shall return 45 32 15
}
return 0;
}
[编辑:添加示例]
答案 0 :(得分:0)
因为您使用的是c ++ 11
for( auto& s : latitude )
{
cout<<s<<endl;
i_latitude.push_back( strtoint(s) );
}
您应该使用引用来避免执行字符串复制
int strtoint( const string & str)
{ ...