分别对两个向量进行排序?

时间:2016-12-08 09:03:23

标签: c++ vector

我必须制作一个使用以下两个向量的程序: -

vector<double> age;
vector<string> name;

我单独输入他们的输入。我必须创建一个函数sort(),以便按字母顺序对名称进行排序,然后相应地重新组织年龄以匹配名称。

请帮助!!

2 个答案:

答案 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;
}

Demo

答案 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

但是请记住,应该使用评论中指出的不同方法解决此问题。作为家庭作业,这些东西并不总是适用。