c++ - 如何在跟踪原始索引的同时压缩 vector (具有重复项)?

标签 c++ stl

假设我有一个 vector {1,3,1,5,4,2,3,4,5,2}( vector 大小可能非常大),

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";
}

关于c++ - 如何在跟踪原始索引的同时压缩 vector (具有重复项)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22159516/

相关文章:

c++ - 使用内联命名空间进行 API 版本控制

c++ - SDL_HasEvent() 和 SDL_GetEventState() 有什么区别?

c++ - GetAdaptersInfo 和 GetAdaptersAddressess BufferLength 参数

c++ - Priority_queue 的放置和推送

c++ - 模板函数中的默认 const char* 模板参数

c++ - 在 C++ 中复制类似数据结构的任何模板方式、通用方法?

c++ - "class _LIBCPP_TEMPLATE_VIS vector"中宏_LIBCPP_TEMPLATE_VIS的用法是什么

c++ - const 类成员在赋值运算符重载时有用吗?

c++ - 如何排序 vector< pair< int , pair<int , pair<string , pair<int , int >>>>>?

c++ - 如何为集合提供带有迭代器的 const 接口(interface)?