C ++迭代器值变量

时间:2013-09-18 15:22:36

标签: c++ iterator

我在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?
      }
   }

6 个答案:

答案 0 :(得分:2)

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

例如,对于float,您可以使用atof

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

更方便的选择是Boost的lexical_cast,它对支持从std::istream提取的所有类型使用相同的语法:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

float x = stof(*iter_jj);

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

如果你没有C ++ 11:

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

答案 3 :(得分:0)

好吧,因为你正在使用:

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>:)

答案 4 :(得分:0)

至于将*转换为字符串,在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

答案 5 :(得分:-1)

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