Connecting Tech Pros Worldwide Forums | Help | Site Map

STL / iterator / map - I dont get it

cppquest
Guest
 
Posts: n/a
#1: Feb 22 '07
Hi all,

I am doing something terrible wrong, but I dont understand why!
Maybe I am sitting too long in front of this box!
This is a breakdown of some code:

#include <map>

class MyMap : public std::map< double* , int { };

MyMap test;

void findMyDouble(double* d)
{
MyMap::iterator iter;
for( iter = test.begin(); iter != test.end(); ++iter)
{
if(*iter->first == 2.0)
{
//assign t2 to d
d = iter->first;
// d == t2
// *d == 2.0
// okay until here
break;
}
}
}

int main(int argc, char** argv)
{
double* t1 = new double(1.0);
double* t2 = new double(2.0);
double* t3 = new double(3.0);

test.insert(MyMap::value_type(t1,10));
test.insert(MyMap::value_type(t2,11));
test.insert(MyMap::value_type(t3,12));

double* search;

findMyDouble(search);
//search should be:
//search == t2!
//*search == 2.0
//but search is again not defined

MyMap::reverse_iterator iter;
for( iter = test.rbegin(); iter != test.rend(); ++iter)
delete iter->first;

return 0;
}

I need to extract some map-key, which is a pointer.
The key is the pointer-itself, but i have to find a specific pointer-
value.
in the local scope of findMyDouble everything is okay, but in main
nothing happens at all.

Thanks for help for a tired cpp-victim.


red floyd
Guest
 
Posts: n/a
#2: Feb 22 '07

re: STL / iterator / map - I dont get it


cppquest wrote:
Quote:
Hi all,
>
I am doing something terrible wrong, but I dont understand why!
Maybe I am sitting too long in front of this box!
This is a breakdown of some code:
>
#include <map>
>
class MyMap : public std::map< double* , int { };
>
MyMap test;
>
void findMyDouble(double* d)
{
MyMap::iterator iter;
for( iter = test.begin(); iter != test.end(); ++iter)
{
if(*iter->first == 2.0)
{
//assign t2 to d
d = iter->first;
// d == t2
// *d == 2.0
// okay until here
break;
}
}
}
>
int main(int argc, char** argv)
{
double* t1 = new double(1.0);
double* t2 = new double(2.0);
double* t3 = new double(3.0);
>
test.insert(MyMap::value_type(t1,10));
test.insert(MyMap::value_type(t2,11));
test.insert(MyMap::value_type(t3,12));
>
double* search;
>
findMyDouble(search);
//search should be:
//search == t2!
//*search == 2.0
//but search is again not defined
>
MyMap::reverse_iterator iter;
for( iter = test.rbegin(); iter != test.rend(); ++iter)
delete iter->first;
>
return 0;
}
>
I need to extract some map-key, which is a pointer.
The key is the pointer-itself, but i have to find a specific pointer-
value.
in the local scope of findMyDouble everything is okay, but in main
nothing happens at all.
because search is passed by value. findMyDouble gets a *COPY* of
search. You need to pass by reference, or return the found value.

Mark P
Guest
 
Posts: n/a
#3: Feb 22 '07

re: STL / iterator / map - I dont get it


cppquest wrote:
Quote:
Hi all,
>
I am doing something terrible wrong, but I dont understand why!
Maybe I am sitting too long in front of this box!
This is a breakdown of some code:
>
#include <map>
>
class MyMap : public std::map< double* , int { };
>
MyMap test;
>
void findMyDouble(double* d)
{
MyMap::iterator iter;
for( iter = test.begin(); iter != test.end(); ++iter)
{
if(*iter->first == 2.0)
{
//assign t2 to d
d = iter->first;
// d == t2
// *d == 2.0
// okay until here
break;
}
}
}
>
int main(int argc, char** argv)
{
double* t1 = new double(1.0);
double* t2 = new double(2.0);
double* t3 = new double(3.0);
>
test.insert(MyMap::value_type(t1,10));
test.insert(MyMap::value_type(t2,11));
test.insert(MyMap::value_type(t3,12));
>
double* search;
>
findMyDouble(search);
If you want to modify the value of search by calling findMyDouble, then
findMyDouble needs to take a reference (or pointer) to double*. Declare
it as:

void findMyDouble( double*& d);
Quote:
//search should be:
//search == t2!
//*search == 2.0
//but search is again not defined
>
MyMap::reverse_iterator iter;
for( iter = test.rbegin(); iter != test.rend(); ++iter)
delete iter->first;
>
return 0;
}
>
I need to extract some map-key, which is a pointer.
The key is the pointer-itself, but i have to find a specific pointer-
value.
in the local scope of findMyDouble everything is okay, but in main
nothing happens at all.
>
Thanks for help for a tired cpp-victim.
>
bnonaj
Guest
 
Posts: n/a
#4: Feb 22 '07

re: STL / iterator / map - I dont get it


cppquest wrote:
Quote:
Hi all,
>
I am doing something terrible wrong, but I dont understand why!
Maybe I am sitting too long in front of this box!
This is a breakdown of some code:
>
#include <map>
>
class MyMap : public std::map< double* , int { };
>
MyMap test;
>
void findMyDouble(double* d)
{
MyMap::iterator iter;
for( iter = test.begin(); iter != test.end(); ++iter)
{
if(*iter->first == 2.0)
{
//assign t2 to d
d = iter->first;
// d == t2
// *d == 2.0
// okay until here
break;
}
}
}
>
int main(int argc, char** argv)
{
double* t1 = new double(1.0);
double* t2 = new double(2.0);
double* t3 = new double(3.0);
>
test.insert(MyMap::value_type(t1,10));
test.insert(MyMap::value_type(t2,11));
test.insert(MyMap::value_type(t3,12));
>
double* search;
>
findMyDouble(search);
//search should be:
//search == t2!
//*search == 2.0
//but search is again not defined
>
MyMap::reverse_iterator iter;
for( iter = test.rbegin(); iter != test.rend(); ++iter)
delete iter->first;
>
return 0;
}
>
I need to extract some map-key, which is a pointer.
The key is the pointer-itself, but i have to find a specific pointer-
value.
in the local scope of findMyDouble everything is okay, but in main
nothing happens at all.
>
Thanks for help for a tired cpp-victim.
>
search needs to be initialised with a valid address. Either that
or make it a double and call findMyDouble(&search)

JB
Victor Bazarov
Guest
 
Posts: n/a
#5: Feb 22 '07

re: STL / iterator / map - I dont get it


cppquest wrote:
Quote:
Hi all,
>
I am doing something terrible wrong, but I dont understand why!
Maybe I am sitting too long in front of this box!
This is a breakdown of some code:
>
[..]
void assign_10_to(int a)
{
a = 10;
}

#include <iostream>

int main()
{
int b = 42;
assign_10_to(b);
std::cout << b;
}

What's this program going to print? Why? Now, let's change it
a little bit

int global_ten = 10;

void assign_10_to(int* a)
{
a = &global_ten;
}

#include <iostream>

int main()
{
int b = 42;
assign_10_to(&b);
std::cout << b;
}

What's this program oging to print? Why? What do you need to
change to make it print '10'?

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


Dana Good
Guest
 
Posts: n/a
#6: Feb 22 '07

re: STL / iterator / map - I dont get it


On Feb 22, 10:48 am, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
Quote:
cppquest wrote:
Quote:
Hi all,
>
Quote:
I am doing something terrible wrong, but I dont understand why!
Maybe I am sitting too long in front of this box!
This is a breakdown of some code:
>
Quote:
[..]
>
void assign_10_to(int a)
{
a = 10;
}
>
#include <iostream>
>
int main()
{
int b = 42;
assign_10_to(b);
std::cout << b;
}
>
What's this program going to print? Why? Now, let's change it
a little bit
>
int global_ten = 10;
>
void assign_10_to(int* a)
{
a = &global_ten;
}
>
#include <iostream>
>
int main()
{
int b = 42;
assign_10_to(&b);
std::cout << b;
}
>
What's this program oging to print? Why? What do you need to
change to make it print '10'?
>
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
To make it short and sweet,
- instead of passing "search" (an uninitialized pointer value with no
storage), pass "&search" (a pointer to the place you expect to find a
pointer on return from findMyDouble)
- modify findMyDouble to expect a pointer to a pointer
- in FindMyDouble, *localSearch = (address of found thing);

Or, as was suggested above, have findMyDouble return the address of
the found double. Then you have "search = findMyDouble()" - much
nicer.

Dana

Closed Thread