我有一个载体矢量,比如说
std::vector< std::vector<int> > my2dArray;
现在我想要一个包含my2dArray
内矢量大小的向量。手动这看起来像
std::vector<int> mySizes;
for (int i = 0; i < my2dArray.size(); i++ )
{
mySizes.push_back( my2dArray[i].size() );
}
是否有一种更“优雅”的方式 - 不用手动编写循环 - 通过使用某些STL算法等?
答案 0 :(得分:2)
C ++ 03:
typedef std::vector<int> IntVec;
std::vector<size_t> sizes(my2dArray.size());
std::transform(my2dArray.begin(), my2dArray.end(), sizes.begin(),
std::mem_fun_ref(&IntVec::size));
答案 1 :(得分:0)
关于你将获得的最好成绩(需要C ++ 11)
std::vector<int> mySizes(my2dArray.size());
auto getSize = [](const std::vector<int> & v) { return v.size(); };
std::transform(my2dArray.begin(), my2dArray.end(), mySizes.begin(), getSize);
这不是一个巨大的改进,如果你不能使用lambdas,我认为额外的麻烦不值得。
答案 2 :(得分:0)
这很有效。我试图将sizeVec作为Sizes的成员,但这不像this问题中讨论的那样有效。
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
class Sizes
{
public:
Sizes( std::vector<int>& v ) : sizeVec( v ) {}
void operator() ( std::vector<int>& v ) {
sizeVec.push_back( v.size() );
}
std::vector<int>& sizeVec;
};
void outFunc (int i) {
std::cout << " " << i;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<std::vector<int>> twodVec;
std::vector<int> vec;
vec.push_back( 6 );
twodVec.push_back( vec );
vec.push_back( 3 );
twodVec.push_back( vec );
vec.push_back( 8 );
twodVec.push_back( vec );
vec.push_back( 3 );
twodVec.push_back( vec );
std::vector<int> sizeVec;
Sizes sizes(sizeVec);
std::for_each( twodVec.begin(), twodVec.end(), sizes );
std::for_each( sizeVec.begin(), sizeVec.end(), outFunc );
return 0;
}
编辑:Oli Charlesworth回答了我提出的问题。您可以将对象更改为:
class Sizes
{
public:
void operator() ( std::vector<int>& v ) {
sizeVec.push_back( v.size() );
}
std::vector<int> sizeVec;
};
然后在主要:
Sizes sizes;
sizes = std::for_each( twodVec.begin(), twodVec.end(), sizes );
std::for_each( sizes.sizeVec.begin(), sizes.sizeVec.end(), outFunc );
如果你愿意的话。如果你有提升,你将能够使用Boost.Ref使其变得更加简单。
编辑2:将仿函数更改为通过引用接收向量而不是Alf P Steinbach在我询问的问题中建议的值。