У меня есть набор массивов с городами, странами, широтами и широтами. c++.
ifstream file("worldcities.csv");
getline(file, temporay);
//inputs the file into 4 arrays for each catergories
for (i=0;getline(file,(cities[i]),',');i++)
{
getline(file, countries[i], ',');
getline(file, latitude[i], ',') ;
getline(file, longitude[i]);
}
Как мне сортировать массив широт и долгот одновременно, чтобы найти пятерку самых низких или самых высоких для всех остальных в списке, но в то же время не потерять элементы городов и стран, с которыми связаны латы n longs?
"в то же время не терять элементы городов и стран, с которыми связаны латы n longs",
Когда это значения, которые принадлежат друг другу, почему вы не связали их внутри одного объекта? т.е.:struct Location {
std::string city, country;
double lng, lat;
};
и как только вы загрузите все местоположения в std::vector<Location>
тогда вы можете просто определить собственный компаратор и использовать std::sort
.
Этот вопрос может помочь вам: как использовать std :: sort с вектором структур и функцией сравнения?
Если вы создадите класс или структуру, которая объединяет ваши данные (вместо того, чтобы связывать их с помощью индексов массива), вам будет намного проще управлять:
struct Details
{
std::string city;
std::string country;
double latitude;
double longitude;
};
struct csv_reader : std::ctype<char>
{
csv_reader() : std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table()
{
static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());
rc[','] = std::ctype_base::space;
rc['\n'] = std::ctype_base::space;
return &rc[0];
}
};
// in your program logic
std::ifstream fin("worldcities.csv");
std::vector<Details> vecDetails;
std::string line;
csv_reader reader;
while (std::getline(fin, line))
{
std::istringstream iss(line);
iss.imbue(std::locale(std::locale(), &csv_reader));
Details d;
iss >> d.city >> d.country >> d.latitude >> d.longitude;
vecDetails.push_back(d);
}
// to sort by latitude
std::sort(vecDetails.begin(), vecDetails.end(), [](const Details& l, const Details& r)
{
return l.latitude < r.latitude;
});