Я пытаюсь создать эквивалент функции Excel VLOOKUP для двумерного CSV-файла, который у меня есть. Если бы мне дали число 5, я бы хотел иметь возможность посмотреть на столбец динамической таблицы, которая у меня есть, и найти в этом столбце строку с наибольшим числом меньше пяти.
Например. Если бы я использовал 5 из моего примера раньше:
2 6
3 7
4 11
6 2
9 4
Вернул бы мне 11, данные в паре с самой высокой записью ниже 5.
Я понятия не имею, как это сделать. Если это поможет, записи в первом столбце (столбце, который я буду искать) будут переходить от наименьшего к наибольшему.
Я новичок в C ++, поэтому я прошу прощения, если я пропустил какой-то очевидный метод.
std::map
может сделать это довольно легко:
Вы начнете с создания карты правильного типа, а затем заполните ее своими данными:
std::map<int, int, std::greater<int> > data;
data[2] = 6;
data[3] = 7;
data[4] = 11;
data[6] = 2;
data[9] = 4;
Тогда вы будете искать данные с lower_bound
или же upper_bound
:
std::cout << data.lower_bound(5)->second; // prints 11
Пара замечаний: во-первых, обратите внимание на использование std::greater<T>
как оператор сравнения. Это необходимо, потому что lower_bound
обычно возвращает итератор следующий элемент (вместо предыдущего), если искомый ключ отсутствует на карте. С помощью std::greater<T>
сортирует карту в обратном порядке, поэтому «следующий» элемент будет меньшим, чем большим.
Во-вторых, обратите внимание, что это автоматически сортирует данные по ключам, поэтому зависит только от вставляемых данных, а не от порядка вставки.
Других решений пока нет …