在“2d-vector”(向量< vector>>)中创建向量大小的向量?

时间:2011-08-11 09:21:00

标签: c++ stl 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算法等?

3 个答案:

答案 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在我询问的问题中建议的值。