String class

Pages: 12
Jun 17, 2009 at 5:30pm
I am in the middle of writing a program where I declare two objects to be of the string class. However, I am new to this section of C++ and I think I may have declared them incorrectly (i.e the errors I get when I compile should go away if I fix them). Can anyone tell me the proper way to do this?

This is what I had
String target, pattern;

Where target and pattern were the objects.
Jun 17, 2009 at 5:35pm
C++ is case sensitive, so you have to be careful.
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
using namespace std;

int main()
  {
  string target, pattern;

  ...

  return 0;
  }

Hope this helps.
Jun 17, 2009 at 5:43pm
I thought class names usually began with a capital letter? I suppose the syntax is just different. My mistake. Thank you.
Last edited on Jun 17, 2009 at 5:51pm
Jun 17, 2009 at 5:52pm
Standard library class and function names are lower case, the reason for this may be to make those easier to type.
Jun 17, 2009 at 5:55pm
When you write "user defined" classes it might be typical for the typenames to begin with uppercase letters. That is how it is on the project that I work on. However, the std::string is part of the standard template library, therefore your project specific coding standard doesn't apply here.
Jun 17, 2009 at 5:56pm
Thank you all. I actually had another question and will take the liberty of posting it on this thread. What does the find() function return if the two string arguments are not equal? Is there another function that handles this?
Jun 17, 2009 at 6:01pm
It returns string::npos
There are many string member functions which find something, see http://www.cplusplus.com/reference/string/string/ (scroll down to String operations )
Jun 17, 2009 at 6:12pm
Thank you.
Jun 17, 2009 at 6:16pm
Honestly, sometimes I do not like the string find function because it does not return iterators the way the std algorithms do when searching a container. I prefer using std::find on strings in many cases. The general rule is to prefer the container functions when they provide a function with the same name as an algorithm but this case is an exception for me. The std find algorithms work just as well except that they return iterators instead of the position offset and npos value. I sometimes find it easier to work with iterators, but that is just my opinion.
Jun 17, 2009 at 6:18pm
I agree. It is a remnant of the fact that std::string came before the STL.

Since string::find() of a char isn't really any faster than std::find(), I agree that using std::find() is probably a better solution on the grounds that it is more general.
Jun 17, 2009 at 6:33pm
Interesting, this program was one assigned by my instructor who for purposes of instruction, I assume, required me to use the string class. Honestly, I am new to these std algorithms, but if either one of you has more information on them I would be interested in it.
Jun 17, 2009 at 6:57pm
I was simply stating an opinion. There is nothing wrong with using std::string::find instead of std::find. I was just sharing my personal preference about the subject. The algorithms are found here. I can understand your constraints as a student but as you develop your own knowledge of the language there is no reason that you can't experiment with the algorithms on your own so that you can learn about them. Most have simple main functions demonstrating their use that can easily be copied, pasted, compiled, and executed.

http://cplusplus.com/reference/algorithm/
Jun 17, 2009 at 7:53pm
It returns string::npos

Otherwise known as -1. :)
Jun 17, 2009 at 8:56pm
Don't assume knowledge of magical values.
Jun 17, 2009 at 9:10pm
A "magical value" is one that has no logical explanation. string::size_type(-1) is, as you know, the highest value that a size_type can hold. If 0 is not available as a special value (and it isn't), then -1 is the only other reasonable value to use.

From the C++ Standard: Clause 21.3, Paragraph 6:

static const size_type npos = -1;
Jun 17, 2009 at 9:18pm
http://en.wikipedia.org/wiki/Magic_number_(programming)

Reasonableness doesn't have anything to do with it.

Besides which, you missed my point.
Jun 17, 2009 at 11:37pm
Besides which, you missed my point.

Nope. I understood you completely. However, you've missed the point entirely, which is that string::npos == -1. And obviously reasonableness has EVERYTHING to do with it in this particular case. What other value would you suggest?
Jun 18, 2009 at 12:33am
I think the idea is that if, for some unfathomable reason, the string::npos was changed to -2, then checking vs. -1 won't work. Of course, it is very unlikely it ever will but that's no reason to use -1 when there is a perfectly good constant that explains the check.
Jun 18, 2009 at 12:37am
> Nope. I understood you completely.

So, now you are so smart that you are actually telling me that you actually understood what I said -- even though I don't believe you?

What is your problem?



Don't encourage people to use literal values in place of established symbolic names.

There is a great deal of literature on this very concept for you to use your excellent finding skills to read. Oh, and BTW, I know how to read source code too.


The point is exactly this:
- littering your code with literal constants is typically a bad idea
- using -1 causes compiler complaints when size_type is unsigned (as indicated in the standard) when strict warnings are enabled
- the value of string::npos may potentially change or be modified

Why rely on a constant value when a convenient name is given to it? It is bad programming practice and a bad idea. Please don't encourage utter newbies to even think about doing it.
Jun 18, 2009 at 4:19pm
> So, now you are so smart that you are actually telling me that you
> actually understood what I said -- even though I don't believe you?

So now your arrogance has grown to such monstrous proportions that you are dictatingt to me what I know? You are truly a pathetic little boy! Stop crying and grow up.
Pages: 12