C++ 如何将提取运算符(>;>;)与向量<;bool>;?
在使用C++ 如何将提取运算符(>;>;)与向量<;bool>;?,c++,c++11,vector,extraction-operator,C++,C++11,Vector,Extraction Operator,在使用vector someVector和istringstream someStringStream的示例中,可以执行以下操作: for (int i=0; i < someVector.size(); i++) { someStringStream >> someVector[i]; } 有没有更直接的方法来实现这一点?如果您想要的只是bool和其他类型的相同接口,那么包装起来就很容易了 template <typename T> T read(std::
vector someVector
和istringstream someStringStream
的示例中,可以执行以下操作:
for (int i=0; i < someVector.size(); i++) {
someStringStream >> someVector[i];
}
有没有更直接的方法来实现这一点?如果您想要的只是bool和其他类型的相同接口,那么包装起来就很容易了
template <typename T>
T read(std::istream& stream)
{
T value;
stream >> value; // TODO: guard against failure of extraction, e.g. throw an exception.
return value;
}
如果要使用整个流,可以使用
std::copy
或std::vector
范围构造函数:
std::stringstream ss("1 0 1 0");
std::vector<bool> vec;
std::copy(std::istream_iterator<bool>(ss), {}, std::back_inserter(vec));
这不安全。如果运算符>>失败,则“值”将被取消初始化。要么显式检查流状态,要么将std::ios_base::failbit与流的异常()进行or运算。@ArneVogel在C++11中对此进行了更改:如果提取失败,则将零写入值(请参阅)。然而,我同意在生产代码中进行错误检查是必要的。不过,有很多方法可以做到这一点。选择一个不是问题的范围,伊姆霍。
for (int i=0; i < someIntVector.size(); i++)
{
someIntVector[i] = read<int>(someStringStream);
}
for (int i=0; i < someBoolVector.size(); i++)
{
someBoolVector[i] = read<bool>(someStringStream);
}
template <typename T, typename A>
void fillVectorFromStream(std::istream& stream, std::vector<T, A>& vector)
{
for ( int i = 0; i < vector.size(); ++i )
{
vector[i] = read<T>(stream);
}
}
fillVectorFromStream(streamOfBool, vectorOfBooleanValues);
fillVectorFromStream(streamOfIntegers, vectorOfIntegers);
std::stringstream ss("1 0 1 0");
std::vector<bool> vec;
std::copy(std::istream_iterator<bool>(ss), {}, std::back_inserter(vec));
std::stringstream ss("1 0 1 0");
std::vector<bool> vec(std::istream_iterator<bool>(ss), {});
std::stringstream ss("1 0 1 0");
std::vector<bool> vec(4);
std::generate(std::begin(vec), std::end(vec), [&ss](){ bool val; ss >> val; return val;});