如何将提取运算符 (>>) 与向量一起使用<bool>?

How do you use the extraction operator (>>) with vector<bool>?

本文关键字:gt 一起 lt bool 向量 运算符 提取      更新时间:2023-10-16

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

有没有更直接的实现方法?

如果您想要使用整个流,可以使用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));

现场演示

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

现场演示

现在看看你发布的例子,如果你确定你的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;});

现场演示

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