如何从数据结构向量中收集迭代器

时间:2019-05-04 05:00:08

标签: c++ iterator

我正在寻找有关我要编写的功能的帮助。 目的是获取已加载到向量中的各种数据结构的所有迭代器。

例如:

std::vector<std::unique_ptr<XXXX<std::string>>>

其中XXXX是为其获取迭代器的结构。

真实的例子

std::vector<std::unique_ptr<std::multiset<std::string>>>
std::vector<std::unique_ptr<custom_list<std::string>>>
std::vector<std::unique_ptr<custom_tree<std::string>>>

已编辑:删除了错字

下面是我当前编写的代码,但是它非常复杂,并且不能正确编译

template <typename L, typename V>
bool get_iterators(L to_sort, V all_iterator)
{
    for (auto &&pointer : *(to_sort))
    {   
        if (typeid(pointer) == typeid
(std::unique_ptr<std::multiset<std::string>>))
        {
            all_iterator->push_back(pointer->begin());
        }
        else
        {
            return false;
        }
    }
    return true;
}

template <typename T>
void merge_sort(T &to_sort)
{
    if (typeid(to_sort) == typeid(std::vector<std::unique_ptr<std::multiset<std::string>>>))
    {
        std::vector<std::multiset<std::string>::iterator> all_iterator;
        get_iterators(&to_sort, &all_iterator);


    }
    else
    {
       ...
    }
}

扩展代码也可以执行

if (typeid(pointer) == typeid(std::unique_ptr<std::XXXX<std::string>>))

这似乎非常不必要。另外,当我添加这些额外的检查时,我得到编译错误,提示找不到有效的函数。

如上所述,目的是获取各种数据结构的所有迭代器。

1 个答案:

答案 0 :(得分:0)

这是简单的模板答案:

template<class V>
auto get_iterators(V &v) {
  std::vector<decltype(v.front()->begin())> ret;
  for(auto &u : v)
    ret.push_back(u->begin());
  return ret;
}

通过按值返回,简化了客户端:

auto iters=get_iterators(to_sort);

很容易避免使用迭代器重复实际的算法。