How can I build a std::vector and then sort them?

前端 未结 7 2061
一向
一向 2021-02-06 22:09

I have a bunch of strings that I need to sort. I think a std::vector would be the easiest way to do this. However, I\'ve never used vectors before and so would like some help.

相关标签:
7条回答
  • 2021-02-06 22:42

    You can just do

    std::sort(data.begin(), data.end());
    

    And it will sort your strings. Then go through them checking whether they are in order

    if(names.empty())
        return true; // empty vector sorted correctly
    for(std::vector<std::string>::iterator i=names.begin(), j=i+1; 
            j != names.end(); 
            ++i, ++j)
        if(*i > *j)
            return false;
    return true; // sort verified
    

    In particular, std::string::compare couldn't be used as a comparator, because it doesn't do what sort wants it to do: Return true if the first argument is less than the second, and return false otherwise. If you use sort like above, it will just use operator<, which will do exactly that (i.e std::string makes it return first.compare(second) < 0).

    0 讨论(0)
  • 2021-02-06 22:45

    Try using comaprator:

     #include <cmath>
     #include <cstdio>
     #include <vector>
     #include <iostream>
     #include <algorithm>
     using namespace std;
    
    //comparing function only sorts if string size is equal and keeps the larger integgers at last.
    bool myfunction (string i,string j) 
    { 
    int n=i.length();
    int m=j.length();
    if(n==m)
        return (i<j);
    
    return n<m;   
      }
    
    
    int main() {
    int n;
    cin>>n;
    vector <string> arr(n);
    for(int i=0;i<n;i++)
        cin>>arr[i];
    
    
    sort(arr.begin(),arr.end(),myfunction);
    
    for(int i=0;i<n;i++)
        cout<<arr[i]<<endl;
    
    return 0;
     }
    
    0 讨论(0)
  • 2021-02-06 22:48

    What is the question exactly? It seems everything is already there.

    However, you should probably use std::cout << *i << std::endl;

    1. i is an iterator == pointer to the data in the container, so * is needed
    2. c_str() is a function of std::string and not a variable

    The problems in your code do not relate to your question?

    Some hints for you:

    • std::vector also overrides [] operator, so you can instead save the iterator hassle and use it like an array (iterate from 0 to vector.size()).
    • You could use std::set instead, which has automatically sorting on insertion (binary tree), so you save the extra sorting.
    • Using a functor makes your output even more fun: copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
    0 讨论(0)
  • 2021-02-06 22:48

    For sort use:
    std::sort or std::vector< std::string>::sort(..) method.
    To check if it is sorted:
    use std::is_sorted for check is sorted - http://www.sgi.com/tech/stl/is_sorted.html
    or
    std::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()

    for your case you could use default comparator

    EDITED:
    std::is_sorted is not standard stl function, it defined in sgi stl implementation.
    Thanks @Brian Neal for this note.

    0 讨论(0)
  • 2021-02-06 22:48

    You could use a std::set, which is naturally a sorted container.

    0 讨论(0)
  • 2021-02-06 22:54

    litb is correct, as always.

    I just wanted to point out the more general point - anything that can be compared with < can be sorted with std::sort. I'll sometimes sneak an operator< member function into a struct, just so I can do this.

    0 讨论(0)
提交回复
热议问题