I'm wondering is the standard defined behavior of past bound iterator.
In the following example it seems that afer first "--it", it point to
-1 index. I'm wondering if it is true independent of which STL
implementation that I am using.
#include <iostream>
#include <vector>
int main(int argc, char *argv[]) {
std::vector<int > v;
for(int i = 0; i < 10; ++ i) {
v.push_back(i);
}
std::vector<int >::iterator it = v.begin();
-- it;
-- it;
std::cout << *it << std::endl;
++ it;
std::cout << *it << std::endl;
++ it;
std::cout << *it << std::endl;
++ it;
std::cout << *it << std::endl;
}
The output:
0
0
0
1 7 1911 Pe*******@gmail .com wrote: I'm wondering is the standard defined behavior of past bound iterator.
The defined behavior is that the behavior is undefined. Pe*******@gmail .com wrote: I'm wondering is the standard defined behavior of past bound iterator.
Where did you find that term "past bound"?
In the following example it seems that afer first "--it", it point to -1 index. I'm wondering if it is true independent of which STL implementation that I am using.
Yes, it's true independent of whatever. Its behavour is _undefined_.
#include <iostream> #include <vector>
int main(int argc, char *argv[]) { std::vector<int > v; for(int i = 0; i < 10; ++ i) { v.push_back(i); } std::vector<int >::iterator it = v.begin(); -- it;
Bam!!! 'it' is now _invalid_.
-- it;
BANG!!! Undefined behaviour. Everything after that is irrelevant.
std::cout << *it << std::endl; ++ it; std::cout << *it << std::endl; ++ it; std::cout << *it << std::endl; ++ it; std::cout << *it << std::endl; }
The output: 0 0 0 1
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Victor Bazarov wrote: std::vector<int >::iterator it = v.begin(); -- it; Bam!!! 'it' is now _invalid_.
Do you not get undefined behaviour at this point? Are you saying that
if we did "exit(0);" now, the program would be OK? I didn't realise
that. -- it;
BANG!!! Undefined behaviour. Everything after that is irrelevant.
Pete C wrote: Victor Bazarov wrote: std::vector<int >::iterator it = v.begin(); -- it;
Bam!!! 'it' is now _invalid_.
Do you not get undefined behaviour at this point? Are you saying that if we did "exit(0);" now, the program would be OK? I didn't realise that.
Invalidation of an iterator is a normal thing. Undefined behaviour
occurs when you try to _use_ an invalid iterator. -- it;
BANG!!! Undefined behaviour. Everything after that is irrelevant.
Here, decrementing means using. You need to know its value to give
it a new one. But evaluating the iterator when it's invalid is not
defined.
V
--
Please remove capital As from my address when replying by mail
Victor Bazarov wrote: Pete C wrote: Victor Bazarov wrote: std::vector<int >::iterator it = v.begin(); -- it;
Bam!!! 'it' is now _invalid_.
Do you not get undefined behaviour at this point? Are you saying that if we did "exit(0);" now, the program would be OK? I didn't realise that.
Invalidation of an iterator is a normal thing. Undefined behaviour occurs when you try to _use_ an invalid iterator.
OK, I just had a rummage around in the standard. In 24.1.4 (Table 75)
it say that a precondition for --r (where r is a bidirectional
iterator) is that there must exist an iterator s such that r == ++s.
But because ++s is only valid for iterators that are dereferencable
(Table 74), this condition cannot be satisfied when r lies at the
beginning of a sequence.
So seems to me that a statement like --v.begin(); is a violation of
this precondition. If not, could you please explain where I have gone
wrong? Thanks...
Pete C wrote: [..] OK, I just had a rummage around in the standard. In 24.1.4 (Table 75) it say that a precondition for --r (where r is a bidirectional iterator) is that there must exist an iterator s such that r == ++s. But because ++s is only valid for iterators that are dereferencable (Table 74), this condition cannot be satisfied when r lies at the beginning of a sequence. So seems to me that a statement like --v.begin(); is a violation of this precondition. If not, could you please explain where I have gone wrong? Thanks...
I think you got it right. Note that --v.end() is not a violation (to
be honest, I've never seen "--v.begin()" anywhere, but the 'end' one I
have, indeed).
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Victor Bazarov wrote: Pete C wrote: Victor Bazarov wrote: std::vector<int >::iterator it = v.begin(); -- it;
Bam!!! 'it' is now _invalid_.
Do you not get undefined behaviour at this point? Are you saying that if we did "exit(0);" now, the program would be OK? I didn't realise that.
Invalidation of an iterator is a normal thing. Undefined behaviour occurs when you try to _use_ an invalid iterator.
-- it;
BANG!!! Undefined behaviour. Everything after that is irrelevant.
Here, decrementing means using. You need to know its value to give it a new one. But evaluating the iterator when it's invalid is not defined.
Nope, it isn't. This is intentional; it allows for e.g. simple linked
list
implementations . The first iterator will have list::iterator: :prev==0,
and --it; translates to it = *(it.prev);.
Else, you should be able to decrement it N times, increment it N times,
and get back to begin. Logically, that means the iterator would have to
store N (which is a large overhead for single-linked lists)
Furthermore,
it would be very tricky to keep such an N-before-begin iterator valid
if
one inserts an element at the begin of such a list.
Lots of pain, little gain: a good reason to disallow the creation of
such
invalid iterators altogether. After all, it's equally invalid for
arrays, and we
could handle those as well.
HTH,
Michiel Salters
HTH,
Michiel Salters. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Brandon J. Van Every |
last post by:
What's better about Ruby than Python? I'm sure there's something. What is
it?
This is not a troll. I'm language shopping and I want people's answers. I
don't know beans about Ruby or have any preconceived ideas about it. I have
noticed, however, that every programmer I talk to who's aware of Python is
also talking about Ruby. So it...
|
by: Marco Aschwanden |
last post by:
I just read the changes for 2.4 and while scanning the list the past tense
built-ins got my attention:
sorted() - a new builtin sorted() acts like an in-place list.sort() but
can be used in expressions, as it returns a copy of the sequence, sorted.
reversed() - a new builtin that takes a sequence and returns an iterator
that loops over...
|
by: Steven T. Hatton |
last post by:
This is from ISO/IEC 14882:2003(E) 5.6 4
<quote>
The binary / operator yields the quotient, and the binary % operator yields the remainder from the division
of the first expression by the second. If the second operand of / or % is zero the behavior is undefined; oth-
erwise (a/b)*b + a%b is equal to a. If both operands are nonnegative then...
|
by: Oliver Brausch |
last post by:
Hello,
have you ever heard about this MS-visual c compiler bug?
look at the small prog:
static int x=0;
int bit32() {
return ++x;
}
|
by: KGrein |
last post by:
Hi.
I have a form that contains a combo box with customer number & customer
name in it. The form is called F_DeleteUSCust and the
combo box is named CB_getUScust
It picks up the information for Row Source from a distinct query.
I have the column count as 2 and bound column 1 (saving customer
number).
I have 2 buttons on the form, one to...
| |
by: Thomas G. Marshall |
last post by:
Arthur J. O'Dwyer <ajo@nospam.andrew.cmu.edu> coughed up the following:
> On Thu, 1 Jul 2004, Thomas G. Marshall wrote:
>>
>> Aside: I've looked repeatedly in google and for some reason cannot
>> find what is considered to be the latest ansi/iso C spec. I cannot
>> even find C99 in its final draft. Where in ansi.org or the like do
>> I...
|
by: Martin Hst Normark |
last post by:
Hi everyone
Has anyone got the least experience in integrating the Digital Signature
with an ASP.NET Web Application?
Here in Denmark, as I supose in many other countries, they're promoting the
digital signature. A lot of people already has one, to do their taxes, and
much more. I have to use for a business-to-business e-commerce...
|
by: Mitan |
last post by:
Hello, I'm a beginner with what appears to be a simple question for
which I haven't been able to get an answer. Can someone explain what
"implementation code" is in relation to VB.NET? I want to be sure I
have a good understanding of this before I continue with my studies.
Thanks in advance.
Semper Fi
|
by: Xah Lee |
last post by:
in March, i posted a essay “What is Expressiveness in a Computer
Language”, archived at:
http://xahlee.org/perl-python/what_is_expresiveness.html
I was informed then that there is a academic paper written on this
subject.
On the Expressive Power of Programming Languages, by Matthias
Felleisen, 1990....
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, well explore What is ONU, What Is Router, ONU & Routers main...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it. ...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...
| |