|
| Problem med vector og strings. Fra : Morten Boysen |
Dato : 20-01-01 18:01 |
|
Jeg er begyndt at læse en bog, som hedder "Accelerated C++". I den er
der en opgave, hvor man ved hjælp af vector'er og string's skal tælle
hvor mange gang et ord optræde i inputtet. Programmet nedenfor virker
tilsyneladende også efter hensigten, men hvis de roptræder mere end 4
ord i inputtet, så opstå der en segmentation fault lige inden
udskivning af det sidste ord.
Progammet er kompileret med g++ 2.96. Jeg kan ikke se problemet, men
måske er der en af jer, der kan?
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::string;
int main()
{
cout << "Write a sentence and end with EOF: " << endl << endl;
vector<string> invec;
string input;
while(cin >> input)
invec.push_back(input);
cout << "There is a total of " << invec.size()
<< " words in the input" << endl << endl;
sort(invec.begin(), invec.end());
vector<string>::size_type i = 0;
while(i < invec.size()) {
vector<string>::size_type j;
for(j = 1; invec[i] == invec[i + j]; ++j);
cout << "The word " << invec[i] << " appeared "
<< j << " times." << endl;
i += j;
}
return 0;
}
--
Morten Boysen
| |
Christian Worm Morte~ (20-01-2001)
| Kommentar Fra : Christian Worm Morte~ |
Dato : 20-01-01 18:24 |
|
Hej,
> vector<string>::size_type i = 0;
> while(i < invec.size()) {
> vector<string>::size_type j;
> for(j = 1; invec[i] == invec[i + j]; ++j);
Ups, hvad sker der når i==invec.size()-1 ?
Venlig Hilsen
Christian Worm
| |
Mogens Hansen (20-01-2001)
| Kommentar Fra : Mogens Hansen |
Dato : 20-01-01 23:04 |
|
"Christian Worm Mortensen" <worm@dkik.dk> wrote in message
news:AQja6.51162$W81.529697@twister.sunsite.dk...
> > vector<string>::size_type i = 0;
> > while(i < invec.size()) {
> > vector<string>::size_type j;
> > for(j = 1; invec[i] == invec[i + j]; ++j);
>
> Ups, hvad sker der når i==invec.size()-1 ?
>
Det er ikke "i", som er problemet - det er "j".
Det er ikke givet at "i" nogensinde antager værdien "invec.size()-1" - det
afhænger af input.
Venlig hilsen
Mogens Hansen
| |
Christian Worm Morte~ (21-01-2001)
| Kommentar Fra : Christian Worm Morte~ |
Dato : 21-01-01 20:46 |
|
Hej,
> Det er ikke givet at "i" nogensinde antager værdien "invec.size()-1" - det
> afhænger af input.
Øhh, nej, men ideen er vel at lave et program der ikke fejler uanset
inddata?
Venlig Hilsen
Christian Worm
| |
Mogens Hansen (20-01-2001)
| Kommentar Fra : Mogens Hansen |
Dato : 20-01-01 23:04 |
|
"Morten Boysen" <morten.boysen@aub.dk> wrote in message
news:ivja6.51057$W81.528745@twister.sunsite.dk...
> Jeg er begyndt at læse en bog, som hedder "Accelerated C++". I den er
Den bog er et rigtigt godt valg!
Det er godt at du løser opgaverne. Spørg hvis du får problemer igen senere.
> vector<string>::size_type i = 0;
> while(i < invec.size()) {
Jeg vil anbefale at du skriver:
while(invec.size() != i) {
fordi det fejler tydeligere, hvis du har lavet en fejl. Så kan du ikke
overse den.
> vector<string>::size_type j;
> for(j = 1; invec[i] == invec[i + j]; ++j);
Du tester ikke om "i+j" er mindre end "invec.size()" inden du bruger
"invec[i + j]" - altså:
for(j = 1; invec.size() != i+j && invec[i] == invec[i + j]; ++j);
I øvrigt er det godt at vænne sig til at benytte initialisering, frem for
asignment - selvom det ikke betyder noget i dette konkrete tilfælde:
vector<string>::size_type j = 1; // Initialized
for(; invec[i] == invec[i + j]; ++j);
Så du får
vector<string>::size_type i = 0;
while(invec.size() != i) {
vector<string>::size_type j = 1;
for(; invec.size() != i+j && invec[i] == invec[i + j]; ++j);
cout << "The word " << invec[i] << " appeared "
<< j << " times." << endl;
i += j;
}
Den kan simpelt omskrives til udelukkende at bruge iteratorer, og "for"
løkker:
for(vector<string>::iterator i = invec.begin(); invec.end() != i;) {
vector<string>::iterator j = i+1;
for(; invec.end() != j && *i == *j; ++j);
cout << "The word \"" << *i << "\" appeared " << j-i << " times" <<
endl;
i = j;
}
Jeg syntes det bliver mere overskueligt og det indeholder færre (gentagne)
beregninger (som "invec[i]" og "invec[i+j]").
Hvis jeg kender Andrew König ret, kommer der en tilsvarende opgave, hvor du
skal bruge "map".
Venlig hilsen
Mogens Hansen
| |
|
|