C++迭代器值到变量

C++ iterator value to variable

本文关键字:变量 迭代器 C++      更新时间:2023-10-16

我在C++代码中使用迭代器来检索使用 sqlite3 语句读取的记录。我能够使用cout显示迭代器指向的内容到屏幕。如何将值分配给简单的float或数组变量。

typedef vector<vector<string> > Records;
vector< vector<string> >::iterator iter_ii;
vector<string>::iterator iter_jj;
Records records = select_stmt("SELECT density FROM Ftable where PROG=2.0");
  for(iter_ii=records.begin(); iter_ii!=records.end(); iter_ii++)
   {
      for(iter_jj=(*iter_ii).begin(); iter_jj!=(*iter_ii).end(); iter_jj++)
      {
         cout << *iter_jj << endl; //This works fine and data gets displayed!
         //How do i store the data pointed to by *iter_jj in a simple float variable or array?
      }
   }

C++是类型安全的,因此您需要将字符串显式转换为所需的目标类型。

例如,对于浮点数,您可以使用atof

float f = atof(iter_jj->c_str());

一个更方便的替代方案是 Boost 的 lexical_cast ,它对所有支持从std::istream中提取的类型使用相同的语法:

float f = boost::lexical_cast<float>(*iter_jj);

请注意,如果字符串的内容无法以任何有意义的方式转换为浮点数,则这两种方法都可能以不同的方式失败。

您真正的问题是如何将字符串转换为浮点数。这是一个解决方案。

float value;
stringstream ss(*iter_jj);
if (! (ss >> value))
{
    ERROR failed to convert value
}

如果您有 C++11 兼容的编译器:

float x = stof(*iter_jj);

(显然x可能是循环之外的变量)。

如果您没有 C++11:

stringstream ss(*iter_jj);
float x;
ss >> x;

好吧,既然您正在使用:

std::vector<std::vector<std::string> > records;

这里的实际问题是:如何从对象中检索特定类型的数据std::string

好的方法是为此目的构造和使用std::istringstream对象:

float f;
std::istringstream is(*iter_jj);
if (is >> f)
{
    // handle successful retrieval...
}

只是不要忘记#include <sstream> :)

至于将 * 转换为字符串,在 c++11 中,您可以通过调用静态方法将整数/浮点数转换为字符串 to_string: string str = std::string::to_string(integer/* or float*/);

在 C++98 中,您可以编写自己的to_string:

#include <cstdio>
#include <cstring>
#include <cstdarg>
#include <string>
void format_aux(char* ptr, int size, const char* format, ...) {
    va_list args;
    va_start(args, format);
    vsnprintf(ptr, size, format, args);
    va_end(args);
}
#undef TO_STRING__GEN
#define TO_STRING__GEN(type, arg, size)     
std::string                                 
to_string(type val) {                       
    const int sz = size;                    
    char buf[sz];                           
    format_aux(buf, sz, arg, val);          
    return std::string(buf);                
}                                           
TO_STRING__GEN(int,           "%d", 4*sizeof(int))
TO_STRING__GEN(unsigned int,  "%u", 4*sizeof(unsigned int))
TO_STRING__GEN(long,          "%ld", 4*sizeof(long))
TO_STRING__GEN(unsigned long, "%lu", 4*sizeof(unsigned long))
TO_STRING__GEN(float,         "%f", (std::numeric_limits<float>::max_exponent10 + 20))
TO_STRING__GEN(double,        "%f", (std::numeric_limits<float>::max_exponent10 + 20))
#undef TO_STRING__GEN

*iter_jj会给你一个std::string。 为了将其存储为float,它需要是一个字符串形式的浮点数(例如 "1.23456" ),您将需要调用strtof函数族之一 (http://en.cppreference.com/w/cpp/string/byte/strtof)