将整数字符串解析为 std 向量
Parse string of integers into std vector?
可能的重复项:
解析逗号分隔的 std::string
我想将字符串解析为整数向量:
string s = "1;2;4;8;16;";
vector<int> n = parse_string(s);
// n == [1, 2, 4, 8, 16];
当然,我可以用strtok
和atoi
编写一个简单的代码。但是,具有C++提升的更短的代码是什么?我从未尝试过使用Boost,但听说它可以像使用Python一样简化您的代码。
它可以在没有 Boost 的情况下完成:
string s = "1;2;4;8;16";
vector<int> n;
transform(s.begin(), s.end(), [](char c){return c == ';' ? ' ' : c});
stringstream ss(s);
copy(istream_iterator<int>(ss), istream_iterator<int>(), back_inserter(n));
编辑:如果只想使用 C++03 代码,则必须编写:
char semicolon_to_space(char c){
return c == ';' ? ' ' : c
};
// ...
string s = "1;2;4;8;16";
vector<int> n;
transform(s.begin(), s.end(), semicolon_to_space);
stringstream ss(s);
copy(istream_iterator<int>(ss), istream_iterator<int>(), back_inserter(n))
我不是提升专业,所以我的代码并不理想:
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/foreach.hpp>
#include <iostream>
#include <vector>
#include <string>
int main()
{
using namespace boost::algorithm;
std::vector< std::string > result;
split(result, "1;2;4;8;16;", is_any_of(";"));
BOOST_FOREACH(const std::string& item, result)
{
std::cout << item << std::endl;
}
}
您肯定可以处理is_any_of
我认为在这种情况下应该使用2种单独的算法。第一个将是一个解析器,它将分离您的值 boost::split http://www.boost.org/doc/libs/1_48_0/doc/html/string_algo/reference.html#header.boost.algorithm.string.split_hpp 应该会有所帮助。第二个是词法强制转换,它将把你的字符串整数转换为 int 值,看看 boost::lexical_cast<>。
嗯boost::tokenizer
?想知道我是否遗漏了什么,但这不是这个应用程序的理想选择吗?
http://www.boost.org/doc/libs/1_43_0/libs/tokenizer/char_separator.htm <该页面的示例可以很容易地修改为此处的需要。>
如果它们以空格分隔,则更容易:
如果这是一个很容易添加的要求。
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
string s = "1 2 4 8 16";
std::stringstream s_stream(s);
vector<int> n;
std::copy(std::istream_iterator<int>(s_stream), std::istream_iterator<int>(),
std::back_inserter(n)
);
}
如果必须具有";",则可以插入一个简单的转换器类。
struct IntReader
{
int value;
operator int() {return value;}
friend std::istream& operator>>(std::istream& stream, IntReader& data)
{
char x = 0;
if ((stream >> data.value >> x) && (x != ';'))
{ stream.setstate(std::ios::failbit);
}
return stream;
}
};
然后只需更改副本即可使用它:
std::copy(std::istream_iterator<IntReader>(s_stream), std::istream_iterator<IntReader>(),
std::back_inserter(n)
);
相关文章:
- std::向量与传递值的动态数组
- 如何在旧c++中初始化const-std向量
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 如何初始化 std::向量的映射?
- 迭代时将指向differents类型的指针保存在std::向量中
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- yaml-cpp到std::向量迭代的怪异行为
- 故意泄漏std::向量的内存
- 调整STD ::向量的大小是否可以降低其能力
- std ::向量距离函数如何给出比.size()更高的值
- C++ std::向量插入两个元素替代算法失败
- 错误:数字常数之前的预期无限制ID:std :: array和std ::向量大小分配
- 在我提供的此示例中,如何将2维std ::向量的逻辑更改为具有向量[row] [col] [col] [col] [co
- GUI滑块的动态数量,该数量更新具有回调中值的std ::向量
- 是一个std ::向量线程,我的目的是安全的
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- 将std ::向量作为指针参考
- STD ::向量如何调整其内部缓冲区大小
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区