istringstream 和读取浮点数
istringstream and reading float
this question也提到了这个问题。
我正在逐行读取文件 std::getline
。
std::getline(points_file, thisline);
std::istringstream iss(thisline);
int cnt = 0;
Coordinates.resize(NumberOfNodes, std::vector<float>(3));
for(std::istream_iterator<float> iit( iss );
iit!=std::istream_iterator<float>( );
iit++ )
{
assert( cnt < 3 );
*(iit) >> Coordinates[i][cnt];
cnt++;
}
错误信息: error: invalid operands to binary expression ('const float' and 'std::__1::__vector_base<float, std::__1::allocator<float> >::value_type' (aka 'float')) *(iit) >> Coordinates[i][cnt];
如果我尝试改为读取整数,则效果很好。我正在使用 CLANG
。 GCC
似乎没有出现此问题,但是,我无权访问此 atm 以进行实际测试。另外,为什么 CLANG
会失败,如何解决?
使用 push_back 或常规赋值(不是 >>)将值存储在您的容器中:
for(std::istream_iterator<float> iit(iss), iitEnd; iit != iitEnd; iit++)
{
assert( cnt < 3 );
// This means you SHOULDN'T pre-resize()
Coordinates[i].push_back(*iit);
//or
// This means you SHOULD pre-resize()
Coordinates[i][cnt] = *iit;
cnt++;
}
此外,考虑使用类似的东西:
using vec3 = std::array<float, 3>;
而不是 std::vector<float>(3)
以提高性能和安全性。
this question也提到了这个问题。
我正在逐行读取文件 std::getline
。
std::getline(points_file, thisline);
std::istringstream iss(thisline);
int cnt = 0;
Coordinates.resize(NumberOfNodes, std::vector<float>(3));
for(std::istream_iterator<float> iit( iss );
iit!=std::istream_iterator<float>( );
iit++ )
{
assert( cnt < 3 );
*(iit) >> Coordinates[i][cnt];
cnt++;
}
错误信息: error: invalid operands to binary expression ('const float' and 'std::__1::__vector_base<float, std::__1::allocator<float> >::value_type' (aka 'float')) *(iit) >> Coordinates[i][cnt];
如果我尝试改为读取整数,则效果很好。我正在使用 CLANG
。 GCC
似乎没有出现此问题,但是,我无权访问此 atm 以进行实际测试。另外,为什么 CLANG
会失败,如何解决?
使用 push_back 或常规赋值(不是 >>)将值存储在您的容器中:
for(std::istream_iterator<float> iit(iss), iitEnd; iit != iitEnd; iit++)
{
assert( cnt < 3 );
// This means you SHOULDN'T pre-resize()
Coordinates[i].push_back(*iit);
//or
// This means you SHOULD pre-resize()
Coordinates[i][cnt] = *iit;
cnt++;
}
此外,考虑使用类似的东西:
using vec3 = std::array<float, 3>;
而不是 std::vector<float>(3)
以提高性能和安全性。