我有载体的载体,说
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算法之类的?
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));
关于最好的你会得到什么(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);
这不是一个真正的巨大的进步,如果你不能使用lambda表达式,我不认为额外的麻烦将是值得的。
这工作。 我想有sizeVec作为大小的成员,但在讨论,没有工作这个问题。
#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;
}
编辑 :我问这个已经被奥利奇查尔斯沃思回答的问题; 你可以改变的对象:
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:改变仿函数引用,而不是值接收向量由阿尔夫·P施泰因巴赫在我问这个问题的建议。
文章来源: Create vector of sizes of the vectors inside a “2d-vector” (vector< vector<> >)?