2013-06-16 4 views
0

나는 정수와 내가 만든 클래스가있는지도가 있습니다. 이제 목록의 각 요소의 정수를 변경해야합니다.C++지도 요소의 값을 변경하는 방법

std::map<int, Product> ProductList; //This is filled somewhere and can be accessed in my function 

void remove() 
{ 
    std::map<int, Product>::iterator it = ProductList.begin(); 
    for(; it != ProductList.end(); it++) 
    { 
    it->first = it->first - 1; 
    } 
} 

지금 내 컴파일러는 내가 잘못하고있는 중이 야 무엇

error: assignment of read-only member ' std::pair<const int, Product>::first '

말한다 :

는이 같은 STH 생각? 각 요소의 정수에서 1을 뺄 필요가 있습니다.

+0

* (it)를 사용해 보셨습니까? 먼저? –

+0

작동하지 않았습니다. 또한 나는 이것이 어떤 차이를 만들지 이해하지 못한다. – Davlog

+0

int가 맵에서 클래스의 인덱스가되도록하려는 것 같습니다. -> 그냥 Vector를 대신 사용하십시오. –

답변

0

맵에 새 쌍을 삽입하고 이전 맵을 지워야합니다. 새지도를 만드는 것이 가장 좋습니다.

std::map<int,Product> oldProductList; 
std::map<int,Product> newProductList; 
std::map<product,int>::iterator it = iksProductList.begin(); 
for(; it != ProductList.end(); it++) 
{ 
    newProductList[it->first - 1] = it->second; 
} 
+0

그래서 나는 모든 것을 지우고 다시 정수를 1만큼 빼기 위해 다시 삽입해야합니까? – Davlog

+0

"하나의 정수를 뺍니다", "지도에서 키 - 값 쌍의 키를 변경하려고합니다"그리고 그렇게 할 수 없습니다! 반복자를 통해서가 아닙니다. – Bogatyr

+0

지도 [...]를 이와 같이 사용하지 마십시오. 제품을 기본으로 구성한 다음 복사 생성자를 사용합니다. map.insert (...)를 사용하는 것이 더 빠릅니다. – JRG

2

지도의 키는 수정할 수 없습니다. 지도는 요소를 내부적으로 재정렬해야하므로 새지도를 만들어 이전지도로 교체해야합니다.

void remove() 
{ 
    typedef std::map<int, Product> ProductMap; 

    ProductMap shifted; 
    ProductMap::const_iterator it = ProductList.begin(); 
    ProductMap::const_iterator end = ProductList.end(); 

    for(; it != end; ++it) 
     shifted.insert(std::pair<int, Product>(it->first - 1, it->second)); 

    ProductList.swap(shifted); 
} 
+0

컴파일러는 템플릿 인수가 누락되기 전에 '('토큰이 새로운 쌍을 삽입하는 줄에 토큰을 넣었습니다. 무엇이 잘못되었는지 이해하지 못합니다 . – Davlog

+1

std :: pair (...); updated – JRG

1

당신은 그렇게 할 수 없습니다. 지도에서 요소의 키를 수정하려고합니다. 키가 값을 잠금 해제하므로 값은 키로 잠금 해제됩니다. 어떻게 다른 키로 동일한 값을 잠금 해제 할 수 있습니까?

키를 사용하여 값을 쉽게 얻을 수 있기 때문에지도를 사용하고 있습니다. 그러나 키를 인덱스로 사용하려고 시도하고 있습니다. 불가능한 것은 다른 데이터 구조입니다.

요소에 벡터를 사용하거나 키에 벡터를 사용하거나지도의 임시 사본을 사용해야한다고 생각합니다. 당신이 왜이 일을하려고하는지에 대해 더 많은 정보를 주시면, 그 해결책에 대해서 좀 더 구체적으로 설명 할 수있을 것입니다.

+0

글쎄, 제품과 색인이 있어야한다. 사용자가 이전이나 다음을 클릭하면 그 제품으로 가야한다. 그러나 사용자가 모든 색인을 제거해야 할 때마다 사용자가 새 제품을 추가 할 수 있어야합니다.지도 나 벡터보다 목록이 좋을 것 같아요. – Davlog

+1

예,이 작업의 경우 목록이 좋은 데이터 구조가 될 수 있습니다. –

관련 문제