Cal*_*ski 7 c++ vector extraction-operator c++11
在一个示例中vector<int> someVector,istringstream someStringStream你可以这样做:
for (int i=0; i < someVector.size(); i++) {
someStringStream >> someVector[i];
}
Run Code Online (Sandbox Code Playgroud)
我知道这vector<bool>是一个有效的实现,并operator[]返回一个引用对象.对于这段代码,我应该使用索引而不是迭代器,主要是为了提高可读性.目前,我正在使用这个:
for (int i=0; i < someVector.size(); i++) {
bool temp;
someStringStream >> temp;
someVector[i] = temp;
}
Run Code Online (Sandbox Code Playgroud)
是否有更直接的方式来实现这一点?
如果要使用整个流,可以使用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));
Run Code Online (Sandbox Code Playgroud)
std::stringstream ss("1 0 1 0");
std::vector<bool> vec(std::istream_iterator<bool>(ss), {});
Run Code Online (Sandbox Code Playgroud)
现在查看您发布的示例,如果您确定您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;});
Run Code Online (Sandbox Code Playgroud)
如果您想要的只是 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;
}
Run Code Online (Sandbox Code Playgroud)
但是,直接使用它需要您指定类型。
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);
}
Run Code Online (Sandbox Code Playgroud)
如果您将其重复用于多个不同的向量,只需再次包装它:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,使用就变成了
fillVectorFromStream(streamOfBool, vectorOfBooleanValues);
fillVectorFromStream(streamOfIntegers, vectorOfIntegers);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |