2015-08-08 33 views
-3

我想获取表示的地图的连续元素的特定长度的每个可能子集的载体,每固有顺序,例如:表示地图的子集获取矢量

enter image description here

岂今做完了?

+0

该图像不够清晰。请解释你正在努力实现的更多细节。 – Banex

+0

不应该很难用例如['std :: transform'](http://en.cppreference.com/w/cpp/algorithm/transform)和['std :: back_inserter'](http://en.cppreference.com/w/cpp/iterator/back_inserter)。因为它们不是随机访问迭代器,所以需要对地图迭代器进行一些工作。 –

+0

@Banex我想将所有连续的地图值提取到矢量中。通过连续我的意思是key(n)> key(n-1)。这些值应该分组为特定长度的向量(在图像长度等于3) – TheChosenOne

回答

2

您可以重复艾弗地图关键是有序的:

std::vector<std::array<Sample, 3u>> get_triplets(const std::map<int, Sample>& samples) 
{ 
    if (samples.size() < 3) { 
     return {}; 
    } 
    std::vector<std::array<Sample, 3u>> res; 

    auto it = samples.begin(); 
    auto it1 = std::next(it); 
    auto it2 = std::next(it1); 

    for (; it2 != samples.end(); ++it, ++it1, ++it2) { 
     res.push_back({{it->second, it1->second, it2->second}}); 
    } 
    return res; 
} 

Live Demo

编辑:有正uplets,从以前的三重版本的小变化:

std::vector<std::vector<Sample>> get_n_uplets(std::size_t n, const std::map<int, Sample>& samples) 
{ 
    if (samples.size() < n) { 
     return {}; 
    } 
    std::vector<std::vector<Sample>> res; 

    auto first = samples.begin(); 
    auto last = std::next(first, n - 1); 

    for (; last != samples.end(); ++first, ++last) { 
     std::vector<Sample> inner; 

     for (auto it = first; it != std::next(last); ++it) { 
      inner.push_back(it->second); 
     } 
     res.push_back(inner); 
    } 
    return res; 
} 

Live Demo

+0

矢量长度不应该被硬编码为3.它可以是任何数字。 – TheChosenOne

+0

@TheChosenOne:添加了n-uplets版本。 – Jarod42