클래스에 다음 데이터 구조가 저장되어 있습니다.
class MyClass {
private:
std::map<std::string, std::set<std::string>> myMap;
public:
void remove(std::string id); //trying to remove items from sets inside myMap
}
그런 다음 세트에서 항목을 삭제하는 방법이 있습니다. 다음 두 가지 방법을 시도했지만 둘 다 작동하지 않았습니다. 접근 1, 사용 for
범위.
for (auto pair : myMap) {
auto set = pair.second;
if (set.count(id)) {
set.erase(id);
}
}
, 사용이 접근 iterator
.
auto it = myMap.begin();
while (it != myMap.end()) {
auto set = it->second;
if (set.count(id)) {
set.erase(id);
}
it++;
}
C ++에서 맵 내부의 집합에서 요소를 제거하는 올바른 방법은 무엇입니까? 내 코드 myMap
는 std::map<std::string, std::set<std::string>*>
(포인터) 로 정의 했을 때 작동했습니다 .
다음과 같다고 가정 std::map
합니다.
std::map<std::string, std::set<std::string>> myMap;
myMap["a"].insert("aaa");
myMap["a"].insert("abb");
myMap["a"].insert("acc");
myMap["b"].insert("aaa");
myMap["b"].insert("abb");
myMap["b"].insert("acc");
그런 다음 다음을 std::set
수행하여 항목을 삭제할 수 있습니다 .
for (auto& i : myMap) {
i.second.erase("aaa");
}
질문의 접근이 작동하지 않는 이유는 무엇입니까?
왜냐하면, 다음을 수행하여 for(auto pair : myMap) {...}
그리고 auto set = pair.second;
실제로에서 데이터의 복사본에 노력하고 있습니다 myMap
. 그래서, 대신 당신은 같은 실제 데이터에 대한 참조를 사용해야 for(auto& pair : myMap) {...}
하고 auto& set = pair.second;
.
또한 존재std::set::erase
하는 std::set
경우 데이터를 제거 하므로 ID의 존재를 수동으로 확인할 필요 가 없습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다