On 08/ 4/11 08:40 AM, jacob navia wrote:
Hi
I would like to compare the C containers library (written in C for C
programmers) against the STL.
Here is the code for the CCL. Maybe one C++ wizard would solve the
same problem using the STL?
I would be very ingterested in comparing code size, complexity, etc.
Thanks in advance, and here is the C part:
--------------------------------------------------------------
Unique
------
Given a text file, print in standard output the lines that are
unique in it, i.e. filtering all duplicated lines.
Algorithm:
---------
Normally this involves keeping a sorted list/array of lines
and testing if a line is in the set or not.
Solution using the CCL.
----------------------
1 #include<containers.h>
2 int main(int argc,char *argv[])
3 {
4 FILE *f;
5 int i=1,r;
6 Dictionary *dict;
7 char buf[8192];
8
9 if (argc< 2) {
10 fprintf(stderr,"%s<file name>\n",argv[0]);
11 return -1;
12 }
13 f = fopen(argv[1],"r");
14 if (f == NULL)
15 return -1;
16 dict = iDictionary.Create(0,500);
17 if (dict == NULL)
18 return -1;
19 while (fgets(buf,sizeof(buf),f)) {
20 r= iDictionary.Add(dict,buf,NULL);
21 if (r> 0)
22 printf("[%3d] %s",i,buf);
23 else if (r< 0) break;
24 i++;
25 }
26 iDictionary.Finalize(dict);
27 fclose(f);
28 }
Algorithm
---------
A hash table will be used to determine if a line is a duplicate
or not.
This is probably the closest equivalent (sticking to a similar layout
style):
#include <set>
#include <string>
#include <iostream>
#include <fstream>
typedef std::set<std::string> Lines;
int main( int argc, char** argv )
{
std::ifstream in( argv[1] );
Lines unique;
while( in ) {
std::string line;
std::getline( in, line );
if( unique.insert(line).second ) {
std::cout << line << std::endl;
}
}
}
line number, although that's trivial. You'd probably change to cout