如何使用向量<bool>的提取运算符(&gt;&gt;)?

时间:2015-06-03 21:48:09

标签: c++ c++11 vector extraction-operator

vector<int> someVectoristringstream someStringStream的示例中,您可以执行此操作:

for (int i=0; i < someVector.size(); i++) {
  someStringStream >> someVector[i];
}

我知道vector<bool>是一种有效的实现,operator[]返回一个引用对象。 对于这段代码,我应该使用索引而不是迭代器,主要是为了提高可读性。 目前,我正在使用它:

for (int i=0; i < someVector.size(); i++) {
  bool temp;
  someStringStream >> temp;
  someVector[i] = temp;
}

有更直接的方法来实现这个吗?

2 个答案:

答案 0 :(得分:5)

如果您想要使用整个流,可以使用std::copystd::vector范围构造函数:

std::stringstream ss("1 0 1 0");
std::vector<bool> vec;
std::copy(std::istream_iterator<bool>(ss), {}, std::back_inserter(vec));

LIVE DEMO

std::stringstream ss("1 0 1 0");
std::vector<bool> vec(std::istream_iterator<bool>(ss), {});

LIVE DEMO

现在查看您发布的示例,如果您确定std::vector的尺寸合适,可以使用std::generate,如下例所示:

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

LIVE DEMO

答案 1 :(得分:0)

如果您想要的是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;
}

但是,直接使用此功能需要您指定类型。

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