我有一个像std::vector< std::vector< int> >
这样的矢量矢量,从这个矢量我想填充std::vector< int>
,你能告诉我有效的方法吗?我可以使用一些提升功能。我正在使用VS2010。下面的代码片段是我尝试过的:
std::vector<std::vector<int> >::iterator outereItr = vecOfVec.begin();
while(outereItr != vecOfVec.end())
{
std::vector<int>::iterator innerItr1 = (*outereItr).begin();
while(innerItr1 != (*outereItr).end())
{
masterVec.push_back(*innerItr1);
++innerItr1;
}
++outereItr;
}
答案 0 :(得分:6)
您可以使用insert
插入整个矢量,而不是单独插入每个元素。这可能会减少重新分配的次数。
for (auto const & vec : vecOfVec) {
masterVec.insert(masterVec.end(), vec.begin(), vec.end());
}
或者,如果您的编译器不支持新式for
循环并键入演绎
for (std::vector<std::vector<int> >::iterator it = vecOfVec.begin(); it != vecOfVec.end(); ++it) {
masterVec.insert(masterVec.end(), it->begin(), it->end());
}
添加所有向量的大小可能(或可能不是)更高效,然后在开始之前在masterVec
中保留足够的空间。
答案 1 :(得分:4)
您可以使用std::vector::insert功能。
std::vector<int> masterVec;
for(std::vector<std::vector<int> >::iterator it=vecOfVec.begin(); it!=vecOfVec.end(); ++it) {
masterVec.insert(masterVec.end(), it->begin(), it->end());
}
如果你可以使用C ++ 11,代码会更清晰:
std::vector<int> masterVec;
for(const auto& x : vecOfVec) {
masterVec.insert(masterVec.end(), x.begin(), x.end());
}
正如Kiril在评论中指出的,计算结果向量的大小首先是避免重新分配的好主意:
size_t size = 0;
for(std::vector<std::vector<int> >::iterator it=vecOfVec.begin(); it!=vecOfVec.end(); ++it) {
size += it->size();
}
std::vector<int> masterVec;
masterVec.reserve(size);
for(std::vector<std::vector<int> >::iterator it=vecOfVec.begin(); it!=vecOfVec.end(); ++it) {
masterVec.insert(masterVec.end(), it->begin(), it->end());
}