STL / iterator / map - I dont get it

C

cppquest

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.
 
R

red floyd

cppquest said:
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.
 
M

Mark P

cppquest said:
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);
 
B

bnonaj

cppquest said:
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
 
V

Victor Bazarov

cppquest said:
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
 
D

Dana Good

cppquest said:
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

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top