我必须制作一个使用以下两个向量的程序: -
vector<double> age;
vector<string> name;
我单独输入他们的输入。我必须创建一个函数sort(),以便按字母顺序对名称进行排序,然后相应地重新组织年龄以匹配名称。
请帮助!!
答案 0 :(得分:3)
如果您可以在struct
或同等范围内对它们进行分组,则可以为sort
并用于间接的索引创建其他向量:
std::vector<double> ages = /**/;
std::vector<string> names = /**/;
// ages.size() == names.size()
std::vector<std::size_t> indexes(names.size());
std::iota(indexes.begin(), indexes.end(), 0u);
std::sort(indexes.begin(), indexes.end(), [&](std::size_t lhs, std::size_t rhs) {
return names[lhs] < names[rhs];
});
for (auto index : indexes) {
std::cout << names[index] << " has " << ages[index] << std::endl;
}
使用range-v3即可:
std::vector<double> ages = /**/;
std::vector<string> names = /**/;
auto zip = ranges::view::zip(names, ages);
ranges::sort(zip);
for (const auto& z : zip) {
std::cout << std::get<0>(z) << " " << std::get<1>(z) << std::endl;
}
答案 1 :(得分:3)
假设你真的需要一个带两个向量并修改它们的函数。
sort函数可以实现为:
void sort ( vector<double>& ages, vector<string>& names)
{
if ( ages.size() != names.size() )
return;
std::map< string, double > helper_map;
for ( size_t id = 0; id < names.size(); ++id)
{
helper_map.emplace( names[id], ages[id] );
}
names.clear();
ages.clear();
for (const auto& helper : helper_map)
{
names.push_back( helper.first );
ages.push_back( helper.second );
}
}
工作示例: http://coliru.stacked-crooked.com/a/2457c832c0b612b2
但是请记住,应该使用评论中指出的不同方法解决此问题。作为家庭作业,这些东西并不总是适用。