Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将提取运算符(>;>;)与向量<;bool>;?_C++_C++11_Vector_Extraction Operator - Fatal编程技术网

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;});