7

在一个示例中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;
}

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

4

2 回答 2

5

如果要使用整个流,可以使用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::stringstream ss("1 0 1 0");
std::vector<bool> vec(std::istream_iterator<bool>(ss), {});

现场演示

现在查看您发布的示例,如果您确定您std::vector的 s 尺寸合适,您可以使用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;});

现场演示

于 2015-06-03T22:11:38.847 回答
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);
于 2015-06-03T22:05:39.157 回答