创建矢量的大小的矢量“2D矢量”内部(矢量<矢量<>>)?(Create v

2019-09-29 02:16发布

我有载体的载体,说

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算法之类的?

Answer 1:

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


Answer 2:

关于最好的你会得到什么(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表达式,我不认为额外的麻烦将是值得的。



Answer 3:

这工作。 我想有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<> >)?
标签: c++ stl vector