473,660 Members | 2,426 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

STL set and its iterator.

Hi, gurus

Is it safe to do this in function?
'return &(*iterator) ';
And iterator is std::set<someth ing>::iterator

Regards,

Jul 23 '05 #1
7 4486

"Prawit Chaivong" <pr******@gmail .com> wrote in message
news:11******** **************@ g47g2000cwa.goo glegroups.com.. .
Hi, gurus

Is it safe to do this in function?
'return &(*iterator) ';
And iterator is std::set<someth ing>::iterator


You've got a char literal '...' and its not being assigned to anything. If
you remove the single-quotes in the statement above:

return &(*iterator) ;

Then no-one can answer your question since its unknown whether the address
of the derefenced object (or pointer) is local to the function.

Jul 23 '05 #2


Peter Julian wrote:
"Prawit Chaivong" <pr******@gmail .com> wrote in message
news:11******** **************@ g47g2000cwa.goo glegroups.com.. .
Hi, gurus

Is it safe to do this in function?
'return &(*iterator) ';
And iterator is std::set<someth ing>::iterator


You've got a char literal '...' and its not being assigned to anything. If
you remove the single-quotes in the statement above:

return &(*iterator) ;

Then no-one can answer your question since its unknown whether the address
of the derefenced object (or pointer) is local to the function.


OK, It was my fault.
This is an example.

------------------------------------
std::set<MyClas s> g_set;

void getBegin(MyClas s **s)
{
std::set<MyClas s>::iterator itr;
itr = g_set.begin();
*s = &(*itr); // is '*itr' temporary?
}
-------------------------------------

Jul 23 '05 #3
"Prawit Chaivong" <pr******@gmail .com> wrote in
news:11******** **************@ z14g2000cwz.goo glegroups.com:


Peter Julian wrote:
"Prawit Chaivong" <pr******@gmail .com> wrote in message
news:11******** **************@ g47g2000cwa.goo glegroups.com.. .
> Hi, gurus
>
> Is it safe to do this in function?
> 'return &(*iterator) ';
> And iterator is std::set<someth ing>::iterator


You've got a char literal '...' and its not being assigned to
anything. If you remove the single-quotes in the statement above:

return &(*iterator) ;

Then no-one can answer your question since its unknown whether the
address of the derefenced object (or pointer) is local to the
function.


OK, It was my fault.
This is an example.

------------------------------------
std::set<MyClas s> g_set;

void getBegin(MyClas s **s)
{
std::set<MyClas s>::iterator itr;
itr = g_set.begin();
*s = &(*itr); // is '*itr' temporary?
}
-------------------------------------


IIRC: by definition *itr is a reference to the instance of the object in
the set. You then take the address of it. This pointer should be valid
until that element in the set is destroyed.
Jul 23 '05 #4
And if g_set is empty... ???

;-)

That's the fundamental problem with interfaces that return
pointers/references... What do you do when you have nothing to point or
refer to?

Jul 23 '05 #5

"Prawit Chaivong" <pr******@gmail .com> wrote in message
news:11******** **************@ z14g2000cwz.goo glegroups.com.. .


Peter Julian wrote:
"Prawit Chaivong" <pr******@gmail .com> wrote in message
news:11******** **************@ g47g2000cwa.goo glegroups.com.. .

<snip>
This is an example.

------------------------------------
std::set<MyClas s> g_set;

void getBegin(MyClas s **s)
{
std::set<MyClas s>::iterator itr;
itr = g_set.begin();
*s = &(*itr); // is '*itr' temporary?
}
-------------------------------------


You are way too short on information and your knowledge on references, set
containers + iterators is rather lacking. This is making helping you very,
very difficult.

An iterator's type should always be type defined, since each STL container
supports predefined iterator types. The question you are asking refers to
*itr and whether its a temporary. When written correctly, and by using a
reference to the std::set container as a parameter to the function, *itr
returns the object thats first in the set's order of elements.

MyClass getBegin(set<My Class>& ref_set)
{
typedef std::set<MyClas s>::iterator SITER;
SITER it = ref_set.begin() ;
return *it;
}

A std::set container relys on a predicate
(http://en.wikipedia.org/wiki/Predicate).
When you insert an object into such a container, that container needs to
compare the insertable element to the elements already in the set. The
following will fail unless you supply an appropriate less_than operator
function to compare MyClass-type objects.

MyClass a;
MyClass b;
MyClass smallest = a < b ? a : b; // returns the lesser of the 2

By default, the std::set uses less<> to insert elements in the ordered
container. This means your MyClass class needs to have access to an
operator< for the std::set container to be able to order the elements when
inserting. Usually, the operator< is not a member of the class:

bool operator<(const MyClass& left, const MyClass& right)
{
....
}

In the case you wish to compare MyClass's private members to each other, you
need to make that operator a friend of the class.

#include <iostream>
#include <set>

class MyClass
{
int m_n;
public:
MyClass(int n) : m_n(n) { }
~MyClass() { }
int getN() { return m_n; }
// friendify op< to allow access to private members
friend bool operator<(const MyClass& left, const MyClass& right);
};

// global operator< to compare MyClass-type objects
bool operator<(const MyClass& left, const MyClass& right)
{
return left.m_n < right.m_n;
}

MyClass getBegin(std::s et<MyClass>& ref_set)
{
typedef std::set<MyClas s>::iterator SITER;
SITER it = ref_set.begin() ;
return *it;
}

int main()
{
std::set<MyClas s> myset;
for (size_t i = 1; i < 10; ++i)
{
myset.insert(i) ; // automatically ordered
}

// using a non-member function:
MyClass first = getBegin(myset) ;

std::cout << "[using getBegin()]\tfirst element's value in set = ";
std::cout << first.getN();

// alternative to using a non-member function
typedef std::set<MyClas s>::iterator SITER;
SITER it = myset.begin();

std::cout << "\n[using iterator]\tfirst element's value in set = ";
std::cout << (*it).getN();

return 0;
}

/* output:

[using getBegin()] first element in set = 1
[using iterator] first element in set = 1

*/
Jul 23 '05 #6

"Prawit Chaivong" <pr******@gmail .com> skrev i en meddelelse
news:11******** **************@ z14g2000cwz.goo glegroups.com.. .


Peter Julian wrote:
"Prawit Chaivong" <pr******@gmail .com> wrote in message
news:11******** **************@ g47g2000cwa.goo glegroups.com.. .
> Hi, gurus
>
> Is it safe to do this in function?
> 'return &(*iterator) ';
> And iterator is std::set<someth ing>::iterator


You've got a char literal '...' and its not being assigned to anything.
If
you remove the single-quotes in the statement above:

return &(*iterator) ;

Then no-one can answer your question since its unknown whether the
address
of the derefenced object (or pointer) is local to the function.


OK, It was my fault.
This is an example.

------------------------------------
std::set<MyClas s> g_set;

void getBegin(MyClas s **s)
{
std::set<MyClas s>::iterator itr;
itr = g_set.begin();
*s = &(*itr); // is '*itr' temporary?
}
-------------------------------------

Apart from what others have mentioned, you seem to forget that *iter returns
a MyClass const&, not a MyClass&

/Peter
Jul 23 '05 #7

"Peter Koch Larsen" <pk*****@mailme .dk> wrote in message
news:1d******** ************@ne ws000.worldonli ne.dk...

"Prawit Chaivong" <pr******@gmail .com> skrev i en meddelelse
news:11******** **************@ z14g2000cwz.goo glegroups.com.. .


Peter Julian wrote:
"Prawit Chaivong" <pr******@gmail .com> wrote in message
news:11******** **************@ g47g2000cwa.goo glegroups.com.. .
> Hi, gurus
>
> Is it safe to do this in function?
> 'return &(*iterator) ';
> And iterator is std::set<someth ing>::iterator

You've got a char literal '...' and its not being assigned to anything.
If
you remove the single-quotes in the statement above:

return &(*iterator) ;

Then no-one can answer your question since its unknown whether the
address
of the derefenced object (or pointer) is local to the function.
OK, It was my fault.
This is an example.

------------------------------------
std::set<MyClas s> g_set;

void getBegin(MyClas s **s)
{
std::set<MyClas s>::iterator itr;
itr = g_set.begin();
*s = &(*itr); // is '*itr' temporary?
}
-------------------------------------

Apart from what others have mentioned, you seem to forget that *iter

returns a MyClass const&, not a MyClass&


Thats a good point since modifying the referred_to_obj ect could potentially
break that container's sequence.

Jul 23 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

38
3661
by: Grant Edwards | last post by:
In an interview at http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=273 Alan Kay said something I really liked, and I think it applies equally well to Python as well as the languages mentioned: I characterized one way of looking at languages in this way: a lot of them are either the agglutination of features or they're a crystallization of style. Languages such as APL, Lisp, and Smalltalk are what you might call style...
26
1514
by: Michael Klatt | last post by:
I am trying to write an iterator for a std::set that allows the iterator target to be modified. Here is some relvant code: template <class Set> // Set is an instance of std::set<> class Iterator { public : typedef typename Set::value_type T; typedef typename Set::iterator SetIterator; Iterator(Set& container, const SetIterator& it);
0
1943
by: nick | last post by:
Hi, I need to manage a "layered" collection of objects, where each layer grows independently, e.g, o--+--+--+--+--+ 1st layer | o 2nd layer (empty) | o--+--+--+ 3rd layer |
14
4867
by: shawnk | last post by:
I searched the net to see if other developers have been looking for a writable iterator in C#. I found much discussion and thus this post. Currently (C# 2) you can not pass ref and out arguments to an iterator method (one returning IEnumerable). I WOULD like to do this for transformative operations on a collection. I realize the need to lock target, etc. Does anyone know how to handle 'writable iterators' in C# 2?
0
2673
by: mailforpr | last post by:
Hi. Let me introduce an iterator to you, the so-called "Abstract Iterator" I developed the other day. I actually have no idea if there's another "Abstract Iterator" out there, as I have never looked for one on the net (I did browse the boost library though). It doesn't matter right now, anyway. To put it simply, Abstract Iterator is mainly a wrapper class. It helps
21
5696
by: T.A. | last post by:
I understand why it is not safe to inherit from STL containers, but I have found (in SGI STL documentation) that for example bidirectional_iterator class can be used to create your own iterator classes by inheriting from it, ie. class my_bidirectional_iterator : public bidirectional_iterator<double> { ... };
16
2576
by: mailforpr | last post by:
How do I do that? The thing is, the only information I have about the iterator is the iterator itself. No container it is belonging to or anything. Like template<Iteratorvoid totally_isolated(Iterator& it) { //how do I find out if it points to the end node? }
27
5307
by: Steven D'Aprano | last post by:
I thought that an iterator was any object that follows the iterator protocol, that is, it has a next() method and an __iter__() method. But I'm having problems writing a class that acts as an iterator. I have: class Parrot(object): def __iter__(self): return self def __init__(self): self.next = self._next()
4
2002
by: mkborregaard | last post by:
Hi, I have the weirdest problem, and I can not see what is going wrong. I have made a 2d container class, and am implementing an iterator for that class. However, the ++ operator is behaving very strange. The implementation looks like this (there is a lot of code, but I have only included it all for consistency. The problem is quite small and local): template<typename T> class Row<T> : public std::vector<T> {}; template<typename...
2
2282
by: Terry Reedy | last post by:
Luis Zarrabeitia wrote: Interesting observation. Iterators are intended for 'iterate through once and discard' usages. To zip a long sequence with several short sequences, either use itertools.chain(short sequences) or put the short sequences as the first zip arg. To test without consuming, wrap the iterator in a trivial-to-write one_ahead or peek class such as has been posted before.
0
8428
marktang
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, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
8341
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 synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
8851
Oralloy
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. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
8754
jinu1996
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 captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
8542
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
1
6181
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
5650
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 into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
4343
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
2
1740
bsmnconsultancy
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 effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.