gpt4 book ai didi

c++ - 从现有代码 C++ 制作 vector 函数的问题

转载 作者:行者123 更新时间:2023-12-01 14:49:45 25 4
gpt4 key购买 nike

我的程序有两个名称和年龄 vector 。它对名称 vector 进行排序,并以正确的顺序保持年龄 vector 以匹配排序后的名称 vector 。现在,我想从现有代码中创建一个函数,但我有一些问题。

现有代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>

using namespace std;

int main() {
vector<string> names {"One", "Two", "Three", "Four", "Five"};
vector<unsigned int> ages { 1, 2, 3, 4, 5};
const vector<string> namesCopy = names;

sort(begin(names), end(names));

decltype(ages) sortedAges(ages.size());

for(int i = 0; i < namesCopy.size(); ++i) {
const auto iter = lower_bound(begin(names), end(names), namesCopy[i]);

const auto pos = iter - begin(names);

sortedAges[pos] = ages[i];
}

for(int i = 0 ; i < names.size() ; ++i)
cout << setw(10) << names[i] << setw(4) << sortedAges[i] << '\n' ;
}

Output

功能:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>

using namespace std;

int test(vector<string> testNames, vector<string> testNamesCopy, vector<unsigned int> testAges, vector<unsigned int> testSortedAges) {
for(int i = 0; i < testNamesCopy.size(); ++i) {
const auto iter = lower_bound(begin(testNames), end(testNames), testNamesCopy[i]);

const auto pos = iter - begin(testNames);
return testSortedAges[pos] = testAges[i];
}
}

int main() {
vector<string> names {"One", "Two", "Three", "Four", "Five"};
vector<unsigned int> ages { 1, 2, 3, 4, 5};
const auto namesCopy = names;

sort(begin(names), end(names));

decltype(ages) sortedAges(ages.size());

for(int i = 0 ; i < names.size() ; ++i)
cout << setw(10) << names[i] << setw(4) << test(names, namesCopy, ages, sortedAges) << '\n' ;
}

Output 2

最佳答案

我认为你以错误的方式接近这个。对 2 个 vector 进行排序但必须保持相同的顺序很容易出错。相反,您应该使用成对的 vector 。
std::vector<std::pair<std::string, int>> idendityVec;
然后您可以通过执行名称(对的第一个元素)进行排序
std::sort(idendityVec.begin(), idendityVec.end());
如果你想按年龄排序,你可以声明你自己的比较函数并在 sort 中使用它:
bool lesserAge(const pair<std::string,int> &a,
const pair<std::string,int> &b)
{
return (a.second < b.second);
}
std::sort(idendityVec.begin(), idendityVec.end(), lesserAge);
这给了你这样的东西:

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>

bool lesserAge(const std::pair<std::string, int> &a,
const std::pair<std::string, int> &b)
{
return (a.second < b.second);
}
int main()
{
std::vector<std::pair<std::string, int>> idendityVec = {std::make_pair("three", 3), std::make_pair("four", 4), std::make_pair("two", 2), std::make_pair("one", 1)};

for (auto v : idendityVec)
{
std::cout << "Name=" << v.first << ", age=" << v.second << std::endl;
}
// Sort by age i.e. second element
std::sort(idendityVec.begin(), idendityVec.end(), lesserAge);
for (auto v : idendityVec)
{
std::cout << "Name=" << v.first << ", age=" << v.second << std::endl;
}
//Sort by name i.e first element
std::sort(idendityVec.begin(), idendityVec.end());
for (auto v : idendityVec)
{
std::cout << "Name=" << v.first << ", age=" << v.second << std::endl;
}
}

关于c++ - 从现有代码 C++ 制作 vector 函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58709230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com