c++ - 在"2d vector" ( 矢量 <vector<>> ) 中创建向量的大小向量?

  显示原文与译文双语对照的内容

我有向量向量,比如说


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);

这不是真正的改进,如果你不能使用 mtf,我认为这个问题不值得额外的问题。

原作者:

我试图把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;
};

然后在 main:


Sizes sizes;
sizes = std::for_each( twodVec.begin(), twodVec.end(), sizes );
std::for_each( sizes.sizeVec.begin(), sizes.sizeVec.end(), outFunc );

如果你愿意的话,如果你有提升的话,你将能够使用 Boost.Ref to更简单。

在这个问题中,编辑 2: 改变了函子以接受向量,而不是由 Alf Steinbach提出的值,在这个问题中。

原作者:
...