473,386 Members | 1,943 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

Stroustrup section 5.5 "vector of struct"

this is the code:

-------------------------------------------------------------------------

#include <iostream>
#include <string>
#include <vector>

struct Pair {
std::string name;
double val;
};

std::vector<Pairpairs;

double& value(const std::string s) {
for(int i=0; i < pairs.size(); i++)
if(s == pairs[i].name) return pairs[i].val;

Pair p = {s, -1.1};
pairs.push_back(p); // pair added at the end

return pairs[pairs.size() - 1].val;
}
int main() {

Pair p0 = {"p0", 0.0};
Pair p1 = {"p1", 1.0};
Pair p2 = {"p2", 2.0};

// add to "pairs"
pairs.push_back(p0);
pairs.push_back(p1);
pairs.push_back(p2);

const std::string s1;
std::cout << "now we will check \"pairs\": ";
std::cin >s1;

value(s1);
}
--------------------------------------------------------------------------

basically it is a "vector" of "Pair" to which i added 3 "Pair values".
then i called "value" function which returns a reference to "val"
related to "string" & if "string" is not found in "pairs" then it
simply creates a new "Pair" & adds it to the end of "pairs" .
compilation gave me this error (using "g++ 4.1.1" on BLAG Linux. ):

-------------------------------------------------------------------------
[arnuld@localhost cpp]$ g++ 05_55-references.cpp

05_55-references.cpp: In function 'int main()':
05_55-references.cpp:41: error: no match for 'operator>>' in
'std::cin >s1'
/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/istream:131:
note: candidates are: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT,

[SNIP]

<_CharT, _Traits>::operator>>(void*&) [with _CharT = char, _Traits =
std::char_traits<char>]
/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/istream:230:
note: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT,
_Traits>::operator>>(std::basic_streambuf<_CharT, _Traits>*) [with
_CharT = char, _Traits = std::char_traits<char>]

[arnuld@localhost cpp]$
-------------------------------------------------------------------------------

what is wrong?

Nov 8 '06 #1
13 2038

"arnuld" <ar*****@gmail.comwrote in message
news:11**********************@m7g2000cwm.googlegro ups.com...
this is the code:
Remarks in-line e
>
-------------------------------------------------------------------------

#include <iostream>
#include <string>
#include <vector>
[...]
const std::string s1;
Since you used the 'const' qualifer here, that's
your promise that your code will *not* modify
the object 's1'.
std::cout << "now we will check \"pairs\": ";
std::cin >s1;
.... but here you go trying to modify 's1'. :-)
>
value(s1);
}
[...]
05_55-references.cpp: In function 'int main()':
05_55-references.cpp:41: error: no match for 'operator>>' in
'std::cin >s1'
/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/istream:131:
note: candidates are: std::basic_istream<_CharT, _Traits>&
std::basic_istream<_CharT,
[...]
what is wrong?
You're trying to modify a const object. Not allowed.
Remove 'const' from your definition of 's1'.

I suspect this was just an 'absent-minded' thing you did, and you
do understand what 'const' means. If not, say so, and we'll explain.

-Mike
Nov 8 '06 #2

arnuld wrote in message
<11**********************@m7g2000cwm.googlegroups. com>...
>this is the code:

-------------------------------------------------------------------------

#include <iostream>
#include <string>
#include <vector>

struct Pair {
std::string name;
double val;
};

std::vector<Pairpairs;

double& value(const std::string s) {
for(int i=0; i < pairs.size(); i++)
if(s == pairs[i].name) return pairs[i].val;

Pair p = {s, -1.1};
pairs.push_back(p); // pair added at the end

return pairs[pairs.size() - 1].val;
}
int main() {

Pair p0 = {"p0", 0.0};
Pair p1 = {"p1", 1.0};
Pair p2 = {"p2", 2.0};

// add to "pairs"
pairs.push_back(p0);
pairs.push_back(p1);
pairs.push_back(p2);

const std::string s1;
std::cout << "now we will check \"pairs\": ";
std::cin >s1;

value(s1);
}
--------------------------------------------------------------------------

basically it is a "vector" of "Pair" to which i added 3 "Pair values".
then i called "value" function which returns a reference to "val"
related to "string" & if "string" is not found in "pairs" then it
simply creates a new "Pair" & adds it to the end of "pairs" .
compilation gave me this error (using "g++ 4.1.1" on BLAG Linux. ):

-------------------------------------------------------------------------
[arnuld@localhost cpp]$ g++ 05_55-references.cpp

05_55-references.cpp: In function 'int main()':
05_55-references.cpp:41: error: no match for 'operator>>' in
'std::cin >s1'

[SNIP]
[arnuld@localhost cpp]$
----------------------------------------------------------------------------
---
>
what is wrong?
Look at std::string 's1'.
const std::string s1;
The 'const' means you (or anything else in your program) is allowed to change
it. Remove the 'const', and see if it will work.

Usually you would use a const string like:

const std::string name( "This will stay the same for the whole program" );

--
Bob R
POVrookie
Nov 8 '06 #3

BobR wrote in message ...
>
>>what is wrong?

Look at std::string 's1'.
> const std::string s1;

The 'const' means you (or anything else in your program) is allowed to
change
>it. Remove the 'const', and see if it will work.
The 'const' means you (or anything else in your program) is NOT allowed to
change it. Remove the 'const', and see if it will work.

--
Bob R
POVrookie
Nov 8 '06 #4
Mike Wahler wrote:
news:11**********************@m7g2000cwm.googlegro ups.com...
this is the code:
Remarks in-line e
what does that mean?
You're trying to modify a const object. Not allowed.
Remove 'const' from your definition of 's1'.
I suspect this was just an 'absent-minded' thing you did, and you
do understand what 'const' means. If not, say so, and we'll explain.
i do understand what "const" means but that was really absent-minded
thing i did. anyway i removed it & programme compiled & ran but it does
not do what i intended. i also made some minor changes to function
"value" to get output on my terminal:

-----------------------------------------------------------
double& value(const std::string s) {
for(int i=0; i < pairs.size(); i++)
if(s == pairs[i].name)
{
std::cout << pairs[i].val << "\n";
return pairs[i].val;
}

Pair p = {s, -1.1};
pairs.push_back(p); // pair added at the end
std::cout << pairs[pairs.size() - 1].val << "\n";
}
-------------------------------------------------------------
------------------- OUTPUT --------------------------------
[arnuld@localhost cpp]$ ./a.out
now we will check "pairs": p2
2
[arnuld@localhost cpp]$ ./a.out
now we will check "pairs": p9
-1.1
[arnuld@localhost cpp]$
---------------------------------------------------------------

function "value" returns a "double&" not "int". then why did i get /2/
which is of type /int/ instead of double /2.0/?

Nov 8 '06 #5
Hi arnuld,

If u want to view decimal precision values, u need to set some
properties in cout

try using these statments

cout << showpoint;
cout.precision(2);

Regards.
-Amit Gupta

arnuld wrote:
Mike Wahler wrote:
news:11**********************@m7g2000cwm.googlegro ups.com...
this is the code:
Remarks in-line e

what does that mean?
You're trying to modify a const object. Not allowed.
Remove 'const' from your definition of 's1'.
I suspect this was just an 'absent-minded' thing you did, and you
do understand what 'const' means. If not, say so, and we'll explain.

i do understand what "const" means but that was really absent-minded
thing i did. anyway i removed it & programme compiled & ran but it does
not do what i intended. i also made some minor changes to function
"value" to get output on my terminal:

-----------------------------------------------------------
double& value(const std::string s) {
for(int i=0; i < pairs.size(); i++)
if(s == pairs[i].name)
{
std::cout << pairs[i].val << "\n";
return pairs[i].val;
}

Pair p = {s, -1.1};
pairs.push_back(p); // pair added at the end
std::cout << pairs[pairs.size() - 1].val << "\n";
}
-------------------------------------------------------------
------------------- OUTPUT --------------------------------
[arnuld@localhost cpp]$ ./a.out
now we will check "pairs": p2
2
[arnuld@localhost cpp]$ ./a.out
now we will check "pairs": p9
-1.1
[arnuld@localhost cpp]$
---------------------------------------------------------------

function "value" returns a "double&" not "int". then why did i get /2/
which is of type /int/ instead of double /2.0/?
Nov 8 '06 #6
Amit wrote:
Hi arnuld,

If u want to view decimal precision values, u need to set some
properties in cout

try using these statments

cout << showpoint;
cout.precision(2);
1st, do not top-post.

2nd, you did not get my point. my input was "2.0" ( Pair p2 = { "p2",
2.0} )

i wanted to know why compiler changed it to /int 2/. on the contrary,
if i input / Pair p3 = { "p3", 3.3} / i get 3.3 as output. so this time
compiler did not change it to /int 3/. why so?

Nov 8 '06 #7

Amit wrote in message
<11**********************@h54g2000cwb.googlegroups .com>...
>Hi arnuld,

If u want to view decimal precision values, u need to set some
properties in cout

try using these statments

cout << showpoint;
cout.precision(2);

Regards.
-Amit Gupta
Nice top-post. Been takeing lessons long?
(http://www.parashift.com/c++-faq-lit....html#faq-5.4).

A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Nov 8 '06 #8

arnuld wrote in message ...
>Amit wrote:
>Hi arnuld,
If u want to view decimal precision values, u need to set some
properties in cout

try using these statments

cout << showpoint;
cout.precision(2);

1st, do not top-post.

2nd, you did not get my point. my input was "2.0" ( Pair p2 = { "p2",
2.0} )

i wanted to know why compiler changed it to /int 2/. on the contrary,
if i input / Pair p3 = { "p3", 3.3} / i get 3.3 as output. so this time
compiler did not change it to /int 3/. why so?
What evidence do you have that it is an 'int'? What you see in the output may
be very different than what the variable holds.

Put this in main() and try it:

{
using std::cout;
cout.setf( std::ios_base::fixed );
cout.precision( 20 );
double d1 = 8.126e9;
cout <<"d1 = "<< d1 <<std::endl;

cout.setf( std::ios_base::scientific );
cout.precision(2);
cout <<"d1 = "<< d1 <<std::endl;
cout.precision(6);
cout <<"d1 = "<< d1 <<std::endl;
cout.setf( std::ios_base::fixed );
}

--
Bob R
POVrookie
Nov 8 '06 #9
BobR wrote:
What evidence do you have that it is an 'int'?
becuase i get plain 2 ( not 2.0 )
What you see in the output may
be very different than what the variable holds.
then how will i get the desired output? or how will i know what the
variable holds?
2nd, is it really necessary, practically, to know answers to these 2
questions i have asked?

BTW, what is the "type" of "2" (the output i got)?
Put this in main() and try it:

{
using std::cout;
cout.setf( std::ios_base::fixed );
cout.precision( 20 );
double d1 = 8.126e9;
cout <<"d1 = "<< d1 <<std::endl;

cout.setf( std::ios_base::scientific );
cout.precision(2);
cout <<"d1 = "<< d1 <<std::endl;
cout.precision(6);
cout <<"d1 = "<< d1 <<std::endl;
cout.setf( std::ios_base::fixed );
}
this is the output from "g++ 4.1.1 on BLAG Linux":

-------------------------------------------------------------------
[arnuld@localhost ~]$ ./a.out
d1 = 8126000000.00000000000000000000
d1 = 8.1e+09
d1 = 8.126e+09
[arnuld@localhost ~]$
---------------------------------------------------------------------

you have used what "Amit" told to me: / cout.precision(n) / with your
mysterious / cout.setf( std::ios_base::fixed ); /

Nov 8 '06 #10
* arnuld:
>BobR wrote:
>What evidence do you have that it is an 'int'?

becuase i get plain 2 ( not 2.0 )
The presentation does not tell you anything about the type.

Also, in the case of floating point it only tells you the value
/approximately/, because the internal representation of a floating point
number is finite, and thus cannot represent all numbers exactly.

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Nov 8 '06 #11
Alf P. Steinbach wrote:
The presentation does not tell you anything about the type.
:-(
Also, in the case of floating point it only tells you the value
/approximately/, because the internal representation of a floating point
number is finite, and thus cannot represent all numbers exactly.
OK, now i got it

thanks Alf
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
these signatures taught me how irritating a top-post is. i never did
that since i read your signatures some months ago. thanks for putting
them.

[OT]
BTW, how can i put my signatures in my post so that they appear
everytime automatically. i googled for it, i have signatures in my
gmail but i am not able to know how to do the same at newsgroups.
[/OT]

Nov 8 '06 #12

arnuld wrote in message ...
>BobR wrote:

BTW, what is the "type" of "2" (the output i got)?
char.
>
this is the output from "g++ 4.1.1 on BLAG Linux":
-------------------------------------------------------------------
[arnuld@localhost ~]$ ./a.out
d1 = 8126000000.00000000000000000000
d1 = 8.1e+09
d1 = 8.126e+09
[arnuld@localhost ~]$
---------------------------------------------------------------------

you have used what "Amit" told to me: / cout.precision(n) / with your
mysterious / cout.setf( std::ios_base::fixed ); /
Doc: "The GNU C++ Iostream Library"
"Choices in formatting"
"Changing stream properties using manipulators"

'setf()' is Set Flags.

--
Bob R
POVrookie
Nov 8 '06 #13
arnuld wrote:

[OT]
BTW, how can i put my signatures in my post so that they appear
everytime automatically. i googled for it, i have signatures in my
gmail but i am not able to know how to do the same at newsgroups.
[/OT]

Google Groups does not have that capability, along with many other
features of a real newsreading system. A possible remedy is to get
access to a genuine newsfeed, and then use the newsreader (there are
many available) that has the features you desire.

Your ISP may provide access to a news server. If not, an inexpensive
alternative is http://news.individual.net (the German server), which
costs 10 euro per year (about $13 US currently) for access to text
newsgroups.

There are some free ones. Generally their reliability and retention
aren't as good as NIN, but they are worth looking into if you don't
want to pay.


Brian
Nov 8 '06 #14

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

Similar topics

1
by: bucher | last post by:
Hi, I want to push a const auto_ptr into a vector, but the compile reports errors. Below is the code. class Folder; class Result; class Results { public: int size(){return _Items.size();}
1
by: G Fernandes | last post by:
Hi, can someone tell me what the following words mean as per C/clc: 1) token 2) token sequence 3) scalar variable 4) vector
3
by: Pablo Gutierrez | last post by:
I have a C# method that reads Binary data (BLOB type) from a database and returns the data an array of bytes (i.e byte outbyte = new byte;). The BLOB column is saved into the database by a C...
10
by: Pantokrator | last post by:
Hi, Is there any way to "overload" a struct? e.g. having already struct stA1 { int i_ID; int i_Type; };
4
by: arnuld | last post by:
i wrote a programme to create a vector of 5 elements (0 to 4), here is the code & output: #include <iostream> #include <vector> int main() { std::vector<intivec; // dynamically create a...
11
by: arnuld | last post by:
this is the code which runs without any trouble: ----------------------------------------------------- #include <iostream> #include <string> #include <vector> struct Entry { std::string...
8
by: cman | last post by:
What does this kind of typedef accomplish? typedef struct { unsigned long pte_low; } pte_t; typedef struct { unsigned long pgd; } pgd_t; typedef struct { unsigned long pgprot; } pgprot_t I am...
15
by: arnuld | last post by:
-------- PROGRAMME ----------- /* Stroustrup, 5.6 Structures STATEMENT: this programmes *tries* to do do this in 3 parts: 1.) it creates a "struct", named "jd", of type "address". 2. it...
4
by: Han | last post by:
when I exe my project in vs.net2005,I got the error following: Debug Assertion Failed! Program:........ File:c:\program files\microsoft visual studio 8\vc\include\vector Line:756 ...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
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,...
0
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,...

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.