Vector of struct using and sorting

My definition is
---------------------------------
using namespace std;

struct goodl { int line; string trl; };

struct vetor { goodl gline };

vector<vetor> goodlines;
-----------------------------------

I am not experienced with this topc and need help

I will use goodlines to store found lines in a text file
in the int I will store the line number form the file


I need to do two things that I don't how to

1) adding and reading data to from the vector
2) I need to sort the data in my vectior in
increasing line numbers (they can be mixed up)

Please advice
Why the vetor? It doesn't seem to add anything. You could as well have vector<goodl>.

See the std::sort. It has two versions. The first uses operator< of the elements. The second uses whatever binary predicate you give it.

Actually, you could replace the goodl with std::pair<int,string>. That already has operator<.
Ohh, if it is declared as the pair you suggest then how to adress the items, if they are nameless?
Last edited on
I wouldn't say that vetor doesn't add anything at all. Let's say that goodl is a very common struct used extensively throughout the application. You may not want to change it. Adding vetor gives us the opportunity to add a functor which will do our comparison for us:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct goodl 
{ 
  int line; 
  string trl; 
}; 
struct vetor
{
  goodl gline;
  bool operator() (goodl left, goodl right) { return (left.line < right.line); }
};
std::vector<vetor> goodlines;
// Add data to goodlines
std::sort( goodlines.begin(), goodlines.end(), vetor() );
Ohh I get a lot of compilation errors!

Should not the operator be specified with gline in stead of goodl?


Or am I lost?
I finally got through the compilator with code structure

------------------------
pair <int, string> gdata;
vector<pair<int, string> > goodlines;
------------------------

To fetch data I used
---------------------
trl = goodlines[goodline].second;
------------------------

To sort i could simply write
...............................
sort(goodlines.begin(), goodlines.end());


And to push_back data
--------------------------
gdata.first = infLno; // a number
gdata.second = trline; // a string
goodlines.push_back(gdata);
Last edited on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>

int main ()
{
  // If we can assume that no linenumber is negative, then unsigned
  std::vector<std::pair<unsigned int,std::string>> myvector;
  myvector.reserve(10);  // guess for final size; less reallocations

  // C++11 streamlined push_backs, could be in file-reading loop
  myvector.emplace_back( 3, "Hello" );
  myvector.emplace_back( 4, "world" );
  myvector.emplace_back( 1, "Dolly:" );
  myvector.emplace_back( 4, "again" );

  for (auto& x: myvector)
    std::cout << ' ' << x.first << ' ' << x.second;
  std::cout << '\n';

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

  for (auto& x: myvector)
    std::cout << ' ' << x.first << ' ' << x.second;
  std::cout << '\n';

  return 0;
}
Last edited on
Topic archived. No new replies allowed.