Как отсортировать несколько массивов, которые содержат данные, связанные друг с другом через индекс

0

У меня есть набор массивов с городами, странами, широтами и широтами. 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?

Теги:
arrays
sorting
file-io
vector

2 ответа

5

"в то же время не терять элементы городов и стран, с которыми связаны латы n longs",

Когда это значения, которые принадлежат друг другу, почему вы не связали их внутри одного объекта? т.е.:
struct Location {
    std::string city, country;
    double lng, lat;
};

и как только вы загрузите все местоположения в std::vector<Location> тогда вы можете просто определить собственный компаратор и использовать std::sort.

Этот вопрос может помочь вам: как использовать std :: sort с вектором структур и функцией сравнения?

  • 0
    запутался в том, как загрузить его в структуру из файла cvs и затем использовать переменные.
  • 1
    @ user2770315: Этот вопрос был впервые задан, когда я искал "чтение значений из файла CSV в C ++".
0

Если вы создадите класс или структуру, которая объединяет ваши данные (вместо того, чтобы связывать их с помощью индексов массива), вам будет намного проще управлять:

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;
});
  • 0
    что такое библиотека для чтения локалей и cvs? это дает мне ошибку.
  • 0
    ошибка C2275: 'main :: csv_reader': недопустимое использование этого типа в качестве выражения
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню