繁体   English   中英

如何在跟踪原始索引的同时压缩向量(包含重复项)?

[英]How to simultaneously compress a vector (with duplicates) while keeping track of the original indices?

假设我有一个向量{1,3,1,5,4,2,3,4,5,2} (向量大小可能很大),

indices --> 1 2 3 4 5 6 7 8 9 10
values  --> 1 3 1 5 4 2 3 4 5 2

具有以下关系:

1 --> {1,3}
2 --> {6,10}
3 --> {2,7}
4 --> {5,8}
5 --> {4,9}

现在使用set,我可以将其减少为{1,2,3,4,5}

std::set<int> uniqNumbersSet;
for(unsigned int i = 0; i < uniqNumbers.size(); ++i )
{
    uniqNumbersSet.insert(uniqNumbers[i]);
}
uniqNumbers.assign(uniqNumbersSet.begin(), uniqNumbersSet.end());

但是,我该如何追踪他们的原始关系? 有使用STL的有效方法吗?

您可以使用vectormap

#include <map>
#include <vector>

std::map<int, std::vector<unsigned> > uniqNumMap;
for (unsigned i = 0; i < uniqNumbers.size(); ++i) {
    uniqNumMap[uniqNumbers[i]].push_back(i+1);
}

for (std::map<int, std::vector<unsigned> >::const_iterator i = uniqNumMap.begin(); i != uniqNumMap.end(); ++i) {
    std::cout << i->first << " --> {";
    for (std::vector<unsigned>::const_iterator j = i->second.begin(); j != i->second.end(); ++j) {
        if (j != i->second.begin()) std::cout << ",";
        std::cout << *j;
    }  
    std::cout << "}\n";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM