C++迭代器值到变量
C++ iterator value to variable
我在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)
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 迭代器或反向器的一个变量
- ActorItr 迭代器变量中有什么,* ActorItr 返回什么?
- 从迭代器转换为变量的类型.(C++11 模板)
- 如何将迭代器变量声明为私有成员变量
- C :我可以将成员变量的迭代器带入班级之一
- 作为变量的目录迭代器值
- 迭代器变量在C 中表现奇怪
- 从模板中的迭代器推断变量的类型,out使用auto
- 是 STL 容器静态变量的迭代器
- 模板变量作为unordered_map键,迭代器问题
- C++迭代器值到变量
- 为什么使用迭代器时无法使用成员函数获取成员变量<set>?
- 如何为未知容器声明迭代器变量
- 带有静态数组成员变量的迭代器
- 变量中的Reverse_iterator和迭代器抽象
- 使用vector对象数组将变量与迭代器匹配