2012-03-28 13 views
3

Ich habe einen Vektor mit einigen Werten (3, 3, 6, 4, 9, 6, 1, 4, 6, 6, 7, 3), und ich möchte jede 3 durch eine 54 oder jede 6 mit a ersetzen 1, zum Beispiel und so weiter.Wie bestimmte Werte in einem Vektor in C++ ersetzen?

Also muss ich zuerst durch den Vektor gehen, erhalten die [i] Wert, suchen und jede 3 mit einem 54, ersetzen aber immer noch relevant halten positions.std::set ist vector::swap ein guter Weg? Ich bin nicht einmal sicher, wie dies :(beginnen ich nicht push_back denn das würde verwenden, können nicht die richtige Reihenfolge der Werte halten, wie das ist wichtig

Bitte halten Sie es einfach;. Ich bin nur ein Anfänger :)

Antwort

6

können Sie die replace oder replace_if Algorithmus verwenden.

Online Sample:

#include<vector> 
#include<algorithm> 
#include<iostream> 
#include<iterator> 

using namespace std; 

class ReplaceFunc 
{ 
    int mNumComp; 
    public: 
     ReplaceFunc(int i):mNumComp(i){} 
     bool operator()(int i) 
     { 
       if(i==mNumComp) 
        return true; 
       else 
        return false; 
     } 
}; 


int main() 
{ 
    int arr[] = {3, 3, 6, 4, 9, 6, 1, 4, 6, 6, 7, 3}; 
    std::vector<int> vec(arr,arr + sizeof(arr)/sizeof(arr[0])); 

    cout << "Before\n"; 
    copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, "\n")); 

    std::replace_if(vec.begin(), vec.end(), ReplaceFunc(3), 54); 

    cout << "After\n"; 
    copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, "\n")); 

    return 0; 
} 
+0

, dass ein Prädikat Funktion benötigen würde definiert werden. Wenn Sie nur einen Wert durch einen anderen ersetzen, ist @ Jon's Antwort mit ['std :: replace '] (http://www.cplusplus.com/reference/algorithm/replace/) besser. –

12

Das Werkzeug für den Job ist std::replace:

std::vector<int> vec { 3, 3, 6, /* ... */ }; 
std::replace(vec.begin(), vec.end(), 3, 54); // replaces in-place 

See it in action.

1

Sie könnten jedes Element der Liste durchlaufen.

std::vector<int> vec{3, 3, 6, 4, 9, 6, 1, 4, 6, 6, 7, 3}; 
for(int n=0;n<vec.size();n++) 
    if(vec[n]==3) 
     vec[n]=54; 
0

Verwenden Sie den STL-Algorithmus for_each. Es ist nicht erforderlich, eine Schleife zu erstellen, und Sie können dies mit einem Funktionsobjekt in einer Aufnahme tun, wie unten gezeigt.

http://en.cppreference.com/w/cpp/algorithm/for_each

Beispiel:

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <iterator> 
using namespace std; 

void myfunction(int & i) 
{ 
    if (i==3) 
     i=54; 
    if (i==6) 
     i=1; 
} 


int main() 
{ 
    vector<int> v; 
    v.push_back(3); 
    v.push_back(3); 
    v.push_back(33); 
    v.push_back(6); 
    v.push_back(6); 
    v.push_back(66); 
    v.push_back(77); 
    ostream_iterator<int> printit(cout, " "); 

    cout << "Before replacing" << endl; 
    copy(v.begin(), v.end(), printit); 

    for_each(v.begin(), v.end(), myfunction) 
     ; 

    cout << endl; 
    cout << "After replacing" << endl; 
    copy(v.begin(), v.end(), printit); 
    cout << endl; 
} 

Ausgang:

Before replacing 
3 3 33 6 6 66 77 
After replacing 
54 54 33 1 1 66 77 
Verwandte Themen