如果您仍然遇到问题,您可以使用std::sort 进行排序,并使用std::transform 重新排序从1 开始的索引部分,但需要-std=c++14 才能使用lambda 捕获初始化程序。否则,您将不得不使用循环来重新排序对索引。
基本方法是:
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> 没有任何问题,但如果您没有对索引进行任何其他用途,请考虑使用简单的std::vector<std::string> 并取消std::pair。您可以随时在需要时生成索引。