[排序向量后如何更改索引值? c ++

问题描述 投票:1回答:2

我有一个pair<int, struct>的向量,其中int对应于索引。我用struct对向量进行排序,并希望我的输出向量的int值与新的排序相对应。

我该怎么做?

<1,zone> <2, car> <3, apple>  

排序为:

<3, apple>, <2, car>, <1, zone>

现在,我想更改这些int以对应于向量中的新索引。即与苹果配对为1。我该怎么做?

希望使用STL方式,以便我不只是遍历向量并手动更改它们。

c++
2个回答
0
投票

您总是可以在排序函数中添加重新索引。

void bubbleSort(vector);   //generic bubble sort
{  
    int i, j;  
    for (i = 0; i < vector.size()-1; i++){      
        for (j = 0; j < vector.size()-i-1; j++){
            if (vector[j].second > vector[j+1].second){  
                swap(&arr[j], &arr[j+1]);
                vector[j].first = j+1;   //
                vector[j+1].first = j;   // updating index values here 
             }
         }
     }
}  

或者您可以有一个简单的for循环,该循环通过向量并为其重新索引。

vector<pair<int, struct>> myvector;

for(int i = 0; i < myvector.size(); i++){
    myvector[i].first = i;
}

0
投票

如果仍然遇到问题,可以使用std::sort进行排序,并使用std::sort1开始重新排列配对的索引部分,但需要std::transform才能使用lambda捕获初始化程序。否则,您将不得不使用循环来重新排列配对索引。

基本方法是:

std::transform

添加一小段输出以显示结果以及所需的标题,您可以这样做:

-std=c++14

示例使用/输出

    std::vector<std::pair<int, std::string>> vp {{1, "zone"}, 
                                                 {2, "car"},
                                                 {3, "apple"}};
    ...
    /* sort by string */
    std::sort (vp.begin(), vp.end(), [](const std::pair<int, std::string>& a, 
                                        const std::pair<int, std::string>& b) {
                                            return a.second < b.second; });
    /* reorder integers */
    std::transform (vp.begin(), vp.end(), vp.begin(), 
                    [n = 1](std::pair<int, std::string>& a) mutable { 
                        a.first = n++;
                        return a = {a.first, a.second}; });

虽然使用#include <iostream> #include <utility> #include <vector> #include <algorithm> int main (void) { std::vector<std::pair<int, std::string>> vp {{1, "zone"}, {2, "car"}, {3, "apple"}}; std::cout << "pre-sort/transform:\n"; for (auto& i : vp) std::cout << i.first << ", " << i.second << '\n'; /* sort by string */ std::sort (vp.begin(), vp.end(), [](const std::pair<int, std::string>& a, const std::pair<int, std::string>& b) { return a.second < b.second; }); /* reorder integers */ std::transform (vp.begin(), vp.end(), vp.begin(), [n = 1](std::pair<int, std::string>& a) mutable { a.first = n++; return a = {a.first, a.second}; }); std::cout << "\npost-sort/transform:\n"; for (auto& i : vp) std::cout << i.first << ", " << i.second << '\n'; } 没什么问题,但是,如果您不使用索引,请考虑使用简单的$ ./bin/vectorpair pre-sort/transform: 1, zone 2, car 3, apple post-sort/transform: 1, apple 2, car 3, zone 并取消使用std::vector<std::pair>。您随时可以在需要时生成索引。

© www.soinside.com 2019 - 2024. All rights reserved.