Hi

I have a question.

Basically I want to create a dictionary of words, where a user has typed in a couple of sentencies. Im then supposed to sort it in alphabetic order and also count how many times a word has appeard. The sentence contains letters and whitespaces.

Ex: hi i am typing in a sentence so i can sort it in alphabetic order

a 1
am 1
alphabetic 1
hi 1
i 2
in 2
it 1
order 1
sentence 1
so 1
sort 1
typing 1


The first thing i did was to put the sentence the user typed in a vector, so each word has its own index in the vector.

the next thing I did was to create a function that sorted the words. But I based it on
strcmp and it doesnt support parameters just constant values, as I discovered after writing the function.

So my question is now should I dump strcmp? if so can I do it in a similar way by comparing index?


I submit the code, dont get to detailed in the function because its the first draft.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <cstring>
 
using namespace std;

 
int main(void)
{
  string sentence, word;
  // create a string vector of the words the user typed in
  vector<string> UserVector;
  vector<string> StoreWords;
  vector<string> s1;
 
  cout << "Enter a sentence: ";
  getline(cin, sentence);
 
  // put the sentence into a stream
  istringstream in(sentence);


 //Putting the sentence into a vector
 while (in >> word)
  {
   UserVector.push_back(word);
  }


 
  return 0;
}

void insert(vector<string> s, vector<string> v)
{


for (int j=0; j<=UserVector.size(); j++)
{


	for (int i=0; i<=StoreWords.size(); i++)
	{
		if (strcmp(v[j], s[i]) > 0)
			break;
		else if (strcmp(v[j], s[i]) = 0) 
		{
			s = s1;
			s.resize(i); 
			s.push_back(v[j]);
				
				for (int u=0; u<10; u++)
				{
					s.push_back(s1[u]);
				}
		}

		else (strcmp(v[j], s[i]) < 0)
		{
			
			s = s1; 
			s.resize(i);
			s.push_back(v[j]);
				
				for (int u=0; u<10; u++)
				{
					s.push_back(s1[u]);
				}
			
		}
		
	}



}

1) I would create a structure that holds the count and string for each word

struct words
{
    std::string word;
    int count;
}

Now have a vector of these structures vector<words> wordList; Now when you get a word, search the vector for occurence. It its already in the vector just increment the counter. If not, add a structure to the vector.

as for using strcmp() -- dump it. You don't need it because you can use std::string's == operator to determine if the two strings are equal. And its not necessary to sort the words if you use my suggestion above.

I think the right solution is std::map<std::string,int> (another name of map is dictionary).
Fast search, automatic sorting + Ancient Dragon's counter - three in one solution.

ok ive changed my code, I have got ride of strcmp() and Ive added a struct for the wordlist.

The question is now when i want to put another word in the dictionary (the last step in the function insert), do I need to create a struct for the UserVector because I have an ordianry vector now?

But the major question is if Ive constructed the program correctly from the beginning cuz I cant help feeling its something fundamentally wrong.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <cstring>
 
using namespace std;


void insert(vector<string> a, vector<string> b)
{


//A loop for the words the user typed in
for (int j=0; j <= b.size(); j++)
{
	//A loop for the dictionary, where it searches through. a.size is the size of the current dictionary
	for (int i=0; i <= a.size(); i++)
	{
		//Compares if the word the user typed in whit the word in the dictionary. If its bigger, loop again
		if (b[j] > a[i].Ord)
		{
			break;
		}
		//Is the two strings equal?, if so Antal++
		else if (b[j] == a[i].Ord)
		{
			a[i].Times++;
		}
		//Putting the word in the dictionary....might be some thinking error......
		else
		{
			a = s1; 
			a.resize(i);
			a.push_back(b[i]); 
				for (int k=; k<=s1.size; k++)
				{
					a.push_back(s1[k]);
				}
		}
	}

}

} 
int main(void)
{
	string sentence, word;
	// create a string vector of the words the user typed in
	 vector<string> UserVector;
   	 vector<string> s1;
 
	cout << "Enter a sentence: ";
	getline(cin, sentence);
 
	// put the sentence into a stream
	istringstream in(sentence);

	//Putting the sentence into a vector........ I think I have to create a structure for this...how?
	while (in >> word)
	 {
		UserVector.push_back(word);
	 }


	struct OrdLista
	{
		string Ord;
		int Times;
	};

	//Now we have a vector whit structures
	vector<OrdLista> Vektor;




	int p = 0; 
	cin >> p; //Push 0 to end

 
  return 0;

Don't waste time on these vector based solution debugging troubles.

typedef std::map<std::string,int> Dictionary;
typedef Dictionary::iterator Diter;
typedef Dictionary::const_iterator Citer;
typedef std::pair<std::string,int> V;

// I don't like to inherit from STL classes...
struct Dict
{
    Dict& ins(const std::string& word);
    Dict& ins(const char* pword) 
    {
        if (pword)
            ins(std::string(pword));
        return *this;
    }
    Dictionary dict;
};
// Increment counter if the word found.
Dict& Dict::ins(const std::string& word)
{
    Diter d = dict.find(word);
    if (d != dict.end())
        (*d).second++;
    else // new word
        dict.insert(V(word,1));
    return *this;
}

int main()
{
    Dict d;
    d.ins("vector").ins("all").ins("problems");
    d.ins("avoided").ins("no").ins("vector");
    for (Citer p = d.dict.begin(); p != d.dict.end(); ++p)
        std::cout << (*p).second << '\t' << (*p).first << '\n';
    std::cout.flush();
    // If you want vector of word+counter, here it is:
    std::vector<V> v(d.dict.begin(),d.dict.end());
    std::cout << '=' << v.size() << std::endl;
    return 0;
}
/* Output:
1       all
1       avoided
1       no
1       problems
2       vector
=5
*/
Comments
Excellent usage of the STL components!

Ty ArkM!

Ive learned alot just looking at your code and study the parts in my book...I havent covered some stuff that you use, but I understand it and ive learned alot. I still did my own longer "version" ;)

This question has already been answered. Start a new discussion instead.