을 이름을()를 호출하여 decltype (클래스 : 이름())의 벡터에 클래스의 벡터 변환 std::vector<std::string>
.다음 구조체 <code>MyStruct</code>를 갖는 모든 요소에
const boost::range_detail::transformed_range<(lambda at /tmp/main.cpp:21:36), std::vector<MyStruct, std::allocator<MyStruct> > > => const boost::range_detail::transformed_range<(lambda at /tmp/main.cpp:21:36), std::vector<MyStruct, std::allocator<MyStruct> > >
어떻게 이것을 달성 할 수
#include <iostream>
#include <string>
#include <vector>
#include <boost/range/adaptor/transformed.hpp>
struct MyStruct {
explicit MyStruct(std::string name) : name_(name){}
std::string name() const { return name_; }
private:
std::string name_;
};
int main() {
std::vector<MyStruct> vm;
vm.emplace_back("asd");
vm.emplace_back("qwe");
vm.emplace_back("zxc");
using namespace boost::adaptors;
auto vs = vm | transformed([](const MyStruct& c){return c.name();});
for (const auto& c : vs) std::cout << c << std::endl;
}
하지만 vs
는 벡터하지만이되지 않습니다 : 그래서 같은 그것을 관리해야? 가급적 나는 벡터를 초기화하는 동안 그것을하고 싶습니다 - 벡터를 선언하지 말고 std::copy
또는 비슷한 것을 선언하십시오.
std::vector<std::string> vv;
vv.reserve(boost::size(vs));
boost::copy(vs, std::back_inserter(vv));
하지만 난 (바람직 const
한정자) 한 단계 초기화를 싶습니다
가 나는 유사한 무언가를 할 수 있다는 것을 알고.
필자는 필자가 필요로하는 일종의 고차원 (기능적)지도 기능 또는 표준/부스트/필기체 기능이라고 생각합니다.
범위에서'begin'과'end'는 당신에게 한쌍의 반복자를 줄 것입니다. 'std :: vector'는 한 쌍의 반복자를 취하는 생성자를 가지고 있습니다. –
당신은'std :: vector vs; boost :: copy (vm | transformed ([MyStruct & c) {return c.name();}), std :: back_inserter (vs)); 나는 그보다 더 짧은 것을 모른다. –
Praetorian