Re: comparing string elements
On Feb 21, 4:07 am, "Jim Langston" <tazmas...@rocketmail.com> wrote:
"James Kanze" <james.ka...@gmail.com> wrote in message
news:9765b9c4-9062-4a40-8fc9-7db46286cc70@s13g2000prd.googlegroups.com..=
..
If using an out of bounds index is an error, you should use
[], rather than at(). At least with the implementations I
use, [] treats an out of bounds index as an error condition;
at() treats it as an exceptional (but not wrong) situation.
I.E.
if ( cstr.size() < index )
{
if ( cstr[index] == cstr[index] // do something
}
Of course, that check for size() brings it's own overhead, so
in that case just use .
More frequently, you'll have something like:
assert( index < cstr.size() ) ;
Except, of course, that this code is normally in the
operator[] function itself.
I see a different result. This program in debug mode:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> data(5);
try
{
data.at(5) = 5;
}
catch (...)
{
std::cout << "Error1\n";
}
try
{
// Causes run time overflow
data[5] = 5;
}
catch (...)
{
std::cout << "Error2\n";
}
}
will output
"Error1"
then tell me that memory has been corrupted.
I get:
Error1
/home/team02/jakan/gnu/gcc/install-4.1.0/sparc/lib/gcc/sparc-sun-
solaris2.8/4.1.0/../../../../../include/c++/4.1.0/debug/vector:192:
error: attempt to subscript container with out-of-bounds index
5, but
container only holds 5 elements.
Objects involved in the operation:
sequence "this" @ 0xffbedf34 {
type = N15__gnu_debug_def6vectorIiSaIiEEE;
}
Abort (core dumped)
That's with g++ (4.1.0). I don't have access to a version of
VC++ at the moment (my PC was "upgraded", and all of the
software I installed myself was lost), so I can't check, but I'm
pretty sure that I've checked this in the past, and VC++ (the
Studios 2005 version) also caught the error (with the options I
normally used---since my .bashrc was also lost in the upgrade, I
can't tell you what they were, except that they were called
$VCPPFLAGS:-).
That being the case isn't it opposite of what you say? That
if an overflow is an error condition then .at() should be
used.
At throws an exception. That's NOT what you want in case of a
software error.
I was always lead to be leive that at() would throw on
overflow, [] would not check.
at() is guaranteed to throw, and should be used if you are
prepared to handle the case at some higher level. [] is
undefined behavior, and will cause something similar to an
assertion failure in a good implementation of the library (with,
of course, the possibility of turning the testing off if the
profiler says you have to).
It is regrettable that these checks aren't on by default with
g++, but then, the defaults aren't generally usable for any
compiler I've seen.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34