Это работает. Я пытался использовать sizeVec в качестве члена Sizes, но это не сработало, как обсуждалось в этом вопросе.
#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: изменил функтор для получения вектора по ссылке, а не по значению, как это было предложено Альфом П. Штейнбахом в вопросе, который я задал по этому поводу.