在vector<int> someVector
和istringstream 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::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
的大小是合适的,你可以使用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);