У меня есть вектор, который я хочу отсортировать по алфавиту. Я успешно смог отсортировать его по одному значению индексов в алфавитном порядке, но когда я это делаю, меняется только порядок этого индекса, а не весь вектор. Как я могу заставить его применить изменение порядка ко всему вектору?
Это мой текущий код, который я запускаю:
std::sort (myvector[2].begin(), myvector[2].end(), compare);
bool icompare_char(char c1, char c2)
{
return std::toupper(c1) < std::toupper(c2);
}
bool compare(std::string const& s1, std::string const& s2)
{
if (s1.length() > s2.length())
return true;
if (s1.length() < s2.length())
return false;
return std::lexicographical_compare(s1.begin(), s1.end(),
s2.begin(), s2.end(),
icompare_char);
}
Моя общая структура для этого вектора — вектор [строка] [столбец] где:
| One | Two | Three |
| 1 | 2 | 3 |
| b | a | c |
Например, если бы у меня был вектор:
myvector[0][0] = 'One' AND myvector[2][0]='b'
myvector[0][1] = 'Two' AND myvector[2][1]='a'
myvector[0][2] = 'Three' AND myvector[2][2]='c'
| One | Two | Three |
| 1 | 2 | 3 |
| b | a | c |
И я сортирую это я получаю:
myvector[0][0] = 'One' AND myvector[2][0]='a'
myvector[0][1] = 'Two' AND myvector[2][1]='b'
myvector[0][2] = 'Three' AND myvector[2][2]='c'
| One | Two | Three |
| 1 | 2 | 3 |
| a | b | c |
а не то что я хочу
myvector[0][0] = 'Two' AND myvector[2][0]='a'
myvector[0][1] = 'One' AND myvector[2][1]='b'
myvector[0][2] = 'Three' AND myvector[2][2]='c'
| Two | One | Three |
| 2 | 1 | 3 |
| a | b | c |
Я искал хороший подход, но не мог найти ничего, что сработало … Я думал что-то вроде:
std::sort (myvector.begin(), myvector.end(), compare);
Затем обработайте сортировку третьего индекса в моей функции сравнения, чтобы отредактировать весь вектор … но когда я передавал свои данные, я либо только изменял порядок в функции, но все равно не менял верхний слой или получал ошибки. Любой совет или помощь будет принята с благодарностью. Заранее спасибо.
В идеале объединить 3 поля данных в struct
так что вы можете иметь только 1 вектор и сортировать его просто.
struct DataElement{
std::string str;
char theChar;
int num;
bool operator<(const DataElement& other)const{return theChar<other.theChar;}
};
std::vector<DataElement> myvector;
std::sort (myvector.begin(), myvector.end());
Других решений пока нет …