我有一个pair<int, struct>
的向量,其中int
对应于索引。我用struct
对向量进行排序,并希望我的输出向量的int值与新的排序相对应。
我该怎么做?
<1,zone> <2, car> <3, apple>
排序为:
<3, apple>, <2, car>, <1, zone>
现在,我想更改这些int以对应于向量中的新索引。即与苹果配对为1。我该怎么做?
希望使用STL方式,以便我不只是遍历向量并手动更改它们。
您总是可以在排序函数中添加重新索引。
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;
}
如果仍然遇到问题,可以使用std::sort
进行排序,并使用std::sort
从1
开始重新排列配对的索引部分,但需要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>
。您随时可以在需要时生成索引。