다음 코드에서 나는 int의지도와 클래스 A의 객체를 정의했습니다. funwithPointer와 funwithoutPointer의 두 함수를 정의했습니다. 보시다시피, 저는 클래스 객체에서 투표를 증가시키고지도에 추가하려고합니다. 내가 포인터를 사용하지 않고 객체를 선언 할 때 (funwithoutPointer) 2 번 투표를하면 3 번 호출 할 때 객체의 포인터를 사용하면 아무리 많은 함수를 호출해도 투표를 1 이상으로 늘릴 수 없습니다. 뭐가 문제 야 ? 문 객체에 대한 포인터의 혼동
A a=m.find(i)->second;
a.change();
당신이 A 형의 새로운 객체를 생성하고 데이터 멤버를 증가
의 기능void funwithoutPointer(map<int,A>& m){
for(int i=0;i<5;i++){
if(m.find(i)==m.end()){
A a= A(10);
a.change();
m.insert(pair<int,A>(i,a));
}
else{
A a=m.find(i)->second;
a.change();
}
}
}
에서
#include<iostream>
#include<map>
using namespace std;
class A{
public:
int x;int vote;
A(int a):x(a),vote(0){}
void change(){
cout<<vote<<endl;
vote++;}
};
void funwithPointer(map<int,A>& m){
for(int i=0;i<5;i++){
if(m.find(i)==m.end()){
A* a=new A(10);
a->change();
m.insert(pair<int,A>(i,*a));
}
else{
A* a=&m.find(i)->second;
a->change();
}
}
}
void funwithoutPointer(map<int,A>& m){
for(int i=0;i<5;i++){
if(m.find(i)==m.end()){
A a= A(10);
a.change();
m.insert(pair<int,A>(i,a));
}
else{
A a=m.find(i)->second;
a.change();
}
}
}
int main(){
map<int,A> m;
funwithoutPointer(m);
funwithoutPointer(m);
funwithoutPointer(m);
}
'find' 대신'lower_bound'를 사용하는 것이 더 빠르고, 결과가'end()'와 같거나 키가 'i'와 같지 않다면 d o 암시 된 삽입. :-) –
따라서 :'auto f (map.find (i)); if (f == map.end() || f-> first! = i) m.insert (f, std :: make_pair (...)); 그렇지 않으면 ... ' –
@Slava 내가 사용하면 어떻게됩니까?삽입 (쌍 (i, a)); change() 함수를 다시 호출 한 후. 즉, 업데이트 된 버전을 삽입합니다. –
user3747190