Devon Bernard
Devon Bernard

Reputation: 2300

Sorting Vector Alphabetically by Index Value

I have a vector that I want to sort alphabetically. I have successfully been able to sort it by one indexes value alphabetically, but when I do it only changes the order of that index and not the entire vector. How can I get it to apply the order change to the entire vector? This is my current code I am running:

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);
}

My general structure for this vector is vector[row][column] where:

| One | Two | Three |
|  1  |  2  |   3   |
|  b  |  a  |   c   |

For example if I had a vector:

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   |

And I sort it I get:

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   |

and not what I want:

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   |

I looked around for a good approach but could not find anything that worked... I was thinking something like:

std::sort (myvector.begin(), myvector.end(), compare);

Then handle the sorting of the third index within my compare function so the whole vector would get edited... but when I passed my data I either only changed the order in the function and still did not change the top layer or got errors. Any advice or help would be greatly appreciated. Thank you in advance.

Upvotes: 0

Views: 1514

Answers (1)

Karthik T
Karthik T

Reputation: 31952

Ideally, merge the 3 data fields into a struct so that you can have just 1 vector and so sort it simply.

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());

Upvotes: 4

Related Questions