C++ 从类memebers生成容器

C++ 从类memebers生成容器,c++,algorithm,oop,stl,stl-algorithm,C++,Algorithm,Oop,Stl,Stl Algorithm,我想知道std库中是否有一种算法能够将包含类类型的容器转换为另一个包含该类类型成员的容器 因此,我基本上是在寻找一个STL替代函数,如下面代码中的copy_acces: template<class InputIterator, class OutputIterator, class Accessor> OutputIterator copy_acces(InputIterator first, InputIterator last,

我想知道std库中是否有一种算法能够将包含类类型的容器转换为另一个包含该类类型成员的容器

因此,我基本上是在寻找一个STL替代函数,如下面代码中的copy_acces:

template<class InputIterator, class OutputIterator, class Accessor>
OutputIterator copy_acces(InputIterator first, InputIterator last,
                          OutputIterator result, Accessor acc) 
{
    while (first!=last) {
        *result = acc(*first);
        ++result;
        ++first;
    }

    return result;
}
模板
输出迭代器复制\访问(先输入迭代器,后输入迭代器,
输出计数器结果,存取器acc)
{
while(第一个!=最后一个){
*结果=acc(*第一);
++结果;
++第一,;
}
返回结果;
}
可以这样使用:

using namespace std;

struct A {
    int i;    
};

int main()
{
    vector<A> vecA = {{0}, {1}, {2}};
    vector<int> vecInt;

    copy_acces(vecA.begin(), vecA.end(), 
               back_insert_iterator< vector<int> >(vecInt), 
               [](A a){ return a.i; });

    for(int i : vecInt) {
        cout << i << endl;   
    }
}
std::vector<int> vecInt(vecA.size());
std::transform(vecA.begin(), vecA.end(), vecInt.begin(), [](const A& a){ return a.i; });
使用名称空间std;
结构A{
int i;
};
int main()
{
向量vecA={{0},{1},{2};
向量向量;
复制访问(vecA.begin(),vecA.end(),
返回\u插入\u迭代器(vecInt),
[](A){返回A.i;});
for(int i:vecInt){

cout对于像
int
这样的便宜的默认构造,我将使用如下:

using namespace std;

struct A {
    int i;    
};

int main()
{
    vector<A> vecA = {{0}, {1}, {2}};
    vector<int> vecInt;

    copy_acces(vecA.begin(), vecA.end(), 
               back_insert_iterator< vector<int> >(vecInt), 
               [](A a){ return a.i; });

    for(int i : vecInt) {
        cout << i << endl;   
    }
}
std::vector<int> vecInt(vecA.size());
std::transform(vecA.begin(), vecA.end(), vecInt.begin(), [](const A& a){ return a.i; });
.

试试看,比如:

#include <iostream>     // std::cout
#include <algorithm>    // std::transform
#include <vector>       // std::vector

using namespace std;

struct A {
    int i;    
};

int main()
{
    vector<A> vecA = {{0}, {1}, {2}};
    vector<int> vecInt;

    vecInt.resize(vecA.size());
    std::transform (vecA.begin(), vecA.end(), vecInt.begin(), [](A a){ return a.i; });

    for(int i : vecInt) {
        cout << i << endl;   
    }
}

为什么便宜很重要?如果OP希望向量中有成员,他们需要复制它们anyhow@tobi303因为我正在构造所需大小的if
int
向量,然后进行覆盖。对于默认构造成本较高的东西,最好保留一个back\u插入器,然后使用它,我可以添加它作为替代ive…@ChrisDrew如果我没弄错的话,便宜不是使用std::transform的标准,而是使用back\u inserter的标准,对吧?@exlit,好吧,是的,但是需要使用back\u inserter使得只使用循环比使用
std::transform
。嗯,我以前看过std::transform,但我无法理解如何使用std::transformo将其应用到我的解决方案中。本可以在www.cplusplus.com上查看等效的实现。在@exilit上没问题,很高兴我提供了帮助!