C++ 如果值等于键,则在映射中合并条目

C++ 如果值等于键,则在映射中合并条目,c++,stdmap,C++,Stdmap,我有一个具有以下值的std::map: 231 436 5 29 624 2449 2583 2963 36 42 42 79 现在,如果存在值的键,我想“合并”值。 因此,期望的输出(数据结构无关)将是: 231 4364279 52963 62449 2583 我尝试了遍历映射并对每个值使用std::find。但是我遇到了向量大小大于3的问题,而且对于大型地图来说速度似乎非常慢。下面是一个小示例,没有给出准确的所需输出: int main(int argc, char** argv) {

我有一个具有以下值的std::map:

231
436
5 29
624
2449
2583
2963
36 42
42 79

现在,如果存在值的键,我想“合并”值。 因此,期望的输出(数据结构无关)将是:

231
4364279
52963
62449
2583

我尝试了遍历映射并对每个值使用std::find。但是我遇到了向量大小大于3的问题,而且对于大型地图来说速度似乎非常慢。下面是一个小示例,没有给出准确的所需输出:

int main(int argc, char** argv)
{   
    std::map<int, int> my_map = { {2, 31}, {4, 36}, {5, 29}, {6, 24}, {24, 49}, {25, 83}, {29, 63}, {36, 42}, {42, 79} };

    std::vector<int> temp_vec;
    std::vector<std::vector<int>> destination_vec;

    for (auto it = my_map.begin(); it != my_map.end(); ++it) {

        std::map<int, int>::iterator map_iterator = my_map.find(it->second);
        if (map_iterator == my_map.end()) {
            temp_vec.push_back(it->first);
            temp_vec.push_back(it->second);
        }
        else {
            temp_vec.push_back(it->first);
            temp_vec.push_back(it->second);
            temp_vec.push_back(map_iterator->second);
            // I stopped here because I could try another if loop here or a while loop for the whole process but it seems very inefficient
        }
        destination_vec.push_back(temp_vec);
        temp_vec.clear();
    }
}   
int main(int argc,char**argv)
{   
map my_map={{2,31}、{4,36}、{5,29}、{6,24}、{24,49}、{25,83}、{29,63}、{36,42}、{42,79};
标准:向量温度向量;
std::向量目的地_-vec;
for(自动it=my_map.begin();it!=my_map.end();++it){
std::map::iterator map\u iterator=my\u map.find(it->second);
if(map\u iterator==my\u map.end()){
温度向量推回(它->第一);
温度向量推回(它->秒);
}
否则{
温度向量推回(它->第一);
温度向量推回(它->秒);
临时向量推回(映射迭代器->秒);
//我停在这里是因为我可以在这里尝试另一个if循环,或者在整个过程中尝试一个while循环,但它似乎效率很低
}
目的地车辆后推(临时车辆);
温度向量清除();
}
}   

假设地图无法链接较小的值(如
{{1,42},{2,1}}

您可以使用:

std::map<int, std::vector<int>> foo(std::map<int, int> m)
{
    std::map<int, std::vector<int>> res;

    while (!m.empty())
    {
        auto it = m.begin();
        const auto key = it->first;
        auto& v = res[key];

        while (it != m.end()) {
            auto value = it->second;
            v.push_back(value);
            m.erase(it);
            it = m.find(value);
        }
    }
    return res;
}
std::map foo(std::map m)
{
地图资源;
而(!m.empty())
{
自动it=m.begin();
const auto key=it->first;
自动&v=res[key];
而(it!=m.end()){
自动值=它->秒;
v、 推回(值);
m、 抹去(它);
it=m.find(值);
}
}
返回res;
}


复杂性是
O(n log n)

Remove temp\u vec。只需将目标向量放回(std::vector{that,that})。m.erase hella不是效率低下吗?因为它在删除后复制所有值?@Dimfred:
map::erase
已经摊销了常量复杂性(
map
是基于节点的,而不是像
std::vector
那样的连续内存)。是的,只是查找了它。我还以为是n。那我的心。