std::vector 未正确排序的对

std::vector of pairs not being sorted properly

提问人:Verve 提问时间:2/11/2023 最后编辑:Verve 更新时间:2/11/2023 访问量:73

问:

我正在尝试按它们的第二个值对向量进行排序。我这样做是为了对无序地图进行排序,这是通过将地图转换为向量,然后对向量进行排序来完成的。出于某种原因,我的向量中的一些值不在正确的位置。这是我当前的排序函数:

template<typename T1, typename T2>
void sortMapByValue(std::unordered_map<T1, T2> &m) {
    std::vector<std::pair<T1, T2>> vec = std::vector<std::pair<T1, T2>>(m.begin(), m.end());

    std::sort(vec.begin(), vec.end(),
        [](std::pair<T1, T2> a, std::pair<T1, T2> b) { return a.second < b.second; }
    );

    m = std::unordered_map<std::string, int>(vec.begin(), vec.end());
}

这是我的主要功能:

int main() {
    std::unordered_map<std::string, int> mm;

    for (int i = 0; i < 26; i++) {
        mm["key" + std::to_string(i)] = i;
    }
    sortMapByValue<std::string, int>(mm);

    for (auto p : mm) {
        std::cout << p.first << " | " << p.second << std::endl;
    }
}

这是我的输出:

key24 | 24
key23 | 23
key22 | 22
key21 | 21
key19 | 19
key17 | 17
key18 | 18
key15 | 15
key14 | 14
key12 | 12
key10 | 10
key25 | 25
key16 | 16
key9 | 9
key7 | 7
key20 | 20
key5 | 5
key4 | 4
key6 | 6
key3 | 3
key8 | 8
key2 | 2
key13 | 13
key1 | 1
key11 | 11
key0 | 0

我正在尝试对我的地图进行排序,因为它将按降序将单词的出现情况存储在文件中。

编辑:我尝试过使用地图和无序地图,但它仍然在错误的位置有元素。

C++ 排序 std stdvector

评论

4赞 Drew Dormann 2/11/2023
你想以某种方式订购你的吗?我理解正确吗?unordered_map
0赞 wtz 2/11/2023
您已将排序的向量分配回unordered_map。unordered_map是无序的,无论你如何操作它。
0赞 Verve 2/11/2023
@wtz我尝试使用有序和无序地图进行此操作,尽管每次地图仍然在不适当的位置有元素。
0赞 wtz 2/11/2023
@Verve 无论对地图或unordered_map进行何种操作,您都无法控制迭代地图或键的顺序。键的顺序由底层数据结构决定(映射为红黑树,unordered_map为哈希表)。
0赞 Drew Dormann 2/11/2023
我认为这里的基本问题是“哪些 C++ 容器允许我更改其元素的顺序?您选择的容器不允许这样做。

答:

1赞 André Medeiros 2/11/2023 #1

你不能这样做。 考虑到您正在使用 ,顾名思义,它会无序地存储所有内容。std::unordered_map

std::map也没什么用。它使用二叉树作为后备数据结构,并使用每个节点的键来确定它将被放置在的位置。如果替换它并运行程序,您将看到条目按字典顺序排序,因为映射中的键是 s。std::unordered_mapstd::string

根据您要执行的操作,您可以实现反向映射或在需要排序条目时处理向量表示。