【发布时间】:2016-08-02 23:48:15
【问题描述】:
我(打算)使用this answer 中的代码从 CSV 读取内容。本质上,我在连续的, 字符之间获得了一个字符串迭代器;但我不想将它们放在字符串向量中,而是想将这些字符串解析为(任意)类型 T 的元素,它来自模板参数。所以...
template <typename T>
void foo(const std::string& line)
{
// ....
std::vector<T> vec;
using namespace boost;
tokenizer<escaped_list_separator<char> > tk(
line, escaped_list_separator<char>('\\', ',', '\"'));
for (tokenizer<escaped_list_separator<char> >::iterator i(tk.begin());
i!=tk.end();++i)
{
/* magic goes here */
}
我可以使用 istringstream`(例如建议 here):
std::istringstream iss(*i);
T t; iss >> t;
vec.push_back(t);
但这太过分了(我可能在这里建造了两次甚至三次)。如果 C++ 有一个像 std::to_string 这样的 std::from_string(),那么我会这样做
vec.emplace_back(std::from_string(*i));
但这并不存在。也许boost::lexical_cast?我真的更喜欢使用标准的东西。
我应该怎么做?
【问题讨论】:
-
创建类似
from_string函数的唯一“通用”方法是 使用字符串流,这实际上是boost::lexical_cast的工作原理。当然,它确实依赖于类型(T不管是什么)有一个适当的 `operator>>` 重载。您可能对数字之类的东西有一些专长,例如strtod或stoi被使用)但除此之外,没有办法逃脱istringstream的魔掌。 -
即使存在
from_string函数,我也看不到它在性能/空间方面有多大改善。仅 2-3n 个额外操作,导致总体 O(n)。简洁的代码,你可以封装你自己的模板from_string到sstreams。 -
@aybassiony: 1. 你的意思是 from_string。 2. istringstream 可能需要一些构造 3. istringstream 自己进行窥视、标记化、维护下一个未使用的位置等,而在我的情况下,我知道整个字符串中只有一个值。我确信这会带来一些性能优势。
标签: c++ c++11 tostring generic-programming lexical-cast