PDA

Visualizza la versione completa : [c++] ripulire vector da valori in presenza multipla...


freetom
28-01-2010, 20:23
Ho un vector numeri contenente valori dinamici che talvolta possono risultare presenti più volte... Avrei necessità di eliminare tutte le occorrenze oltre la prima di ogni numero presente nel vector.

es:

2,4,9,10,14,16,25,27,30,33,36,37,39,40,41,44,46,48 ,49,51,61,64,65,69,73,76,78,82,84,86,87,90,90,90,9 0,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90, 90,90,90,90,90,90,90,90,90,90,90,90,

qui andrebbero bene tutti tranne il 90 che deve essere ripulito da tutte le presenze eccedenti la prima...

e ottenere sempre secondo esempio:

2,4,9,10,14,16,25,27,30,33,36,37,39,40,41,44,46,48 ,49,51,61,64,65,69,73,76,78,82,84,86,87,90

Come potrei fare? :confused:

Grazie

:ciauz:

shodan
28-01-2010, 20:30
Il modo più semplice è riversare tutto in un set.


set<int> unique_values(vector_casual.begin(),vector_casual. end());
vector_casual.clear();
std::copy(unique_values.begin(),unique_values.end( ),back_inserter(vector_casual));

freetom
28-01-2010, 20:55
Originariamente inviato da shodan
Il modo più semplice è riversare tutto in un set.


set<int> unique_values(vector_casual.begin(),vector_casual. end());
vector_casual.clear();
std::copy(unique_values.begin(),unique_values.end( ),back_inserter(vector_casual));


E ad esempio visualizzarli?

Es..




for (int h=0; h<unique_values.size();h++)
{

cout << unique_values[h];

}



da errore in quanto un set è diverso rispetto ad un vector anche per quanto riguarda il visualizzare i suoi valori :zizi: ma non ricordo come in quest ultimo caso si possano visualizzare i valori immessi...

tnx

:ciauz:

antotan
28-01-2010, 21:02
Per visualizzare i valori in un set, usa gli iteratori come faccio in (1)



#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main(){
vector<int> vector_casual;

for(int i = 0; i < 5; i++)
{
vector_casual.push_back(i);
vector_casual.push_back(i);
}

set<int> unique_values(vector_casual.begin(),vector_casual. end());
vector_casual.clear();
std::copy(unique_values.begin(),unique_values.end( ),back_inserter(vector_casual));


for(set<int>::iterator i = unique_values.begin(); i != unique_values.end(); i++)
cout << *i << " | "; //<- 1
cout << endl;

for(int i = 0 ; i < vector_casual.size(); i++)
cout << vector_casual.at(i) << " | "; //<- 2
cout << endl;
for(vector<int>::iterator i = vector_casual.begin(); i != vector_casual.end(); i++)
cout << *i << " | "; //<- 3

}


nota però che la copy ti copia i valori nel vector, quindi puoi usare (2) o (3) per visualizzarli.
Ti consiglio di usare at per i vettori, al posto dell'operatore[], in quanto più sicuro (fa controlli sull'indice)

shodan
28-01-2010, 21:03
Il modo più semplice è:


std::copy(unique_values.begin(),unique_values.end( ),ostream_iterator<int,char>(cout,' - '));


quello banale:



set<int>::iterator it;

for (it = unique_values.begin(); it!= unique_values.end(); ++it) {
cout << *it << ' - ';
}
cout << endl;

freetom
28-01-2010, 22:05
ma... mi da uno strano... errore :-(



set<int>::iterator it;


set<int> unique_values(usciti.begin(),usciti.end());
usciti.clear();
std::copy(unique_values.begin(),unique_values.end( ),back_inserter(usciti));

for (it = unique_values.begin(); it!= unique_values.end(); ++it) {

cout << *it << ' - ';

cout << endl;

string uscitistringa;
uscitistringa = intToString(*it);

string datiscelti= uscitistringa+",";
//string datiscelti= ",";

fout2 << datiscelti;
//fout2 << "\n";

}
}


l'errore è questo:
multi-character character constant :confused:

tnx ancora

:ciauz:

antotan
28-01-2010, 22:11
cout << *it << ' - ';

per indicare i caratteri si usa ' (es 'c')
per indicare stringhe " (es "ciao")

deve essere


cout << *it << " - ";

shodan
28-01-2010, 22:31
ma... mi da uno strano... errore :-(

Pensavo avessi capito che era scritto staccato per chiarezza.

freetom
28-01-2010, 22:33
:ciauz:

Loading