获取列表数组中的所有列表项

时间:2016-06-06 22:20:38

标签: c++

生产实例,

std::list<SomeClass*> products[4];

// styleProducts, itemProducts, ... are defined before. 
products[1] = styleProducts;
products[2] = itemProducts;

std::list<SomeClass*> allProducts; // so how to get all products ?

描述:

这里的代码非常简单,我可以使用迭代器将1,2个索引合并到一个列表中,但我的问题在于,这将是多达1000个产品列表,所以我怎么能得到所有!

问题:

我想合并此数组的所有索引以合并到一个列表中。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,可以使用方法.merge(otherlist)解决。

示例:

std::list<int> list1 = { 5,9,0,1,3 };
std::list<int> list2 = { 8,7,2,6,4 };

list1.sort();
list2.sort();

list1.merge(list2);

std::cout << "merged: " << list1 << "\n";

输出: 0 1 2 3 4 5 6 7 8 9

cppreference中的更多信息:http://en.cppreference.com/w/cpp/container/list/merge

编辑:

怎么样:

std::list<SomeClass*> allProducts;

for(int i=0; i<products.size(); ++i){
    allProducts.merge(products[i]);
}

答案 1 :(得分:0)

尝试这样的事情:

std::vector< std::list<SomeClass*>* > products;

products.push_back(&styleProducts);
products.push_back(&itemProducts);
// etc...

std::list<SomeClass*> allProducts;

for (std::vector< std::list<SomeClass*>* >::iterator iter = products.begin(); iter != products.end(); ++iter) {
    allProducts.merge(*iter);
}

可替换地:

#include <algorithm>

struct mergeWith
{
    std::list<SomeClass*> &m_dest;

    mergeWith(std::list<SomeClass*> &dest) : m_dest(dest) {}

    void operator()(std::list<SomeClass*> *l)
    {
        m_dest.merge(*l);
    }
};

std::vector< std::list<SomeClass*>* > products;

products.push_back(&styleProducts);
products.push_back(&itemProducts);
// etc...

std::list<SomeClass*> allProducts;
std::for_each(products.begin(), products.end(), mergeWith(allProducts));

如果您使用的是C ++ 11或更高版本:

std::vector< std::list<SomeClass*>* > products;

products.push_back(&styleProducts);
products.push_back(&itemProducts);
// etc...

std::list<SomeClass*> allProducts;

for (auto l: products) {
    allProducts.merge(*l);
}

可替换地:

#include <algorithm>

std::vector< std::list<SomeClass*>* > products;

products.push_back(&styleProducts);
products.push_back(&itemProducts);
// etc...

std::list<SomeClass*> allProducts;
std::for_each(products.begin(), products.end(), 
  [&](std::list<SomeClass*> *l) { allProducts.merge(*l); }
);
// if you are using C++14 or later, you can replace
// "std::list<SomeClass*> *l" in the lambda with "auto l"...