通过 const std::map 搜索

Searching through a const std::map

我正在研究我的 类 之一,但遇到了绊脚石。我给你一个例子,我的源代码只是 类 的名称,方法和变量名称不同,但实现是相同的。您将在相应函数的代码块中看到我的 problem/s、question/s 和 concern/s。

MyClass.h

#ifndef MY_CLASS_H
#define MY_CLASS_H

const std::string strOne     = std::string( "one" );
const std::string strTwo     = std::string( "two" );
const std::string strThree   = std::string( "three" );
const std::string strUnknown = std::string( "unknown" );

enum Count {
    ONE,
    TWO,
    THREE,
    UNKNOWN
};

class MyClass {
private:
    const std::map<Count, const std::string> m_mCount = createCountMap();
    unsigned short m_uCount;
    std::vector<std::string> m_vItems;
    std::multimap<const std::string, const std::string> m_mmAssociatedItems;

public:
    MyClass();  
    MyClass( const std::string strItem1, const std::string strItem2 );

    static MyClass* get();

    void addItem( Count type, const std::string& strItem2 );
    void addItem( const std::string& strItem1, const std::string& strItem2 );

private:
    static const std::map<Count, const std::string> createCountMap();

 };

 #endif // MY_CLASS_H

MyClass.cpp

#include "stdafx.h"
#include "MyClass.h"

static MyClass* s_pMyClass = nullptr;

const std::map<Count, const std::string> MyClass:createCountMap() {
    std::map<Count, const std::string> m;
    m.insert( std::make_pair( Count::ONE,     strOne ) );
    m.insert( std::make_pair( Count::TWO,     strTwo ) );
    m.insert( std::make_pair( Count::Three,   strThree ) );
    m.insert( std::make_pair( Count::UNKNOWN, strUnknown ) );
    return m;
} // createCountMap

MyClass* MyClass::get() {
    if ( !s_pMyClass ) {
        return nullptr;
    }
    return s_pMyClass;
} // get

MyClass::MyClass() : m_uCount( 0 ) {
    m_vItems.clear();
    m_mmAssociatedItems.clear();
} // MyClass

MyClass::MyClass( const std::string& strItem1, const std::string& strItem2 ) : 
m_uCount( 0 ) {
    addItem( strItem1, strItem2 );
} // MyClass

void MyClass::addItem( Count type, const std::string& strItem2 ) {
    const std::map<Count, const std::string>::const_iterator it = m_mCount.find( type );
    if ( it == m_mCount.end() ) {
        // Did not find a valid item key!
        // Throw Exception Here!
    }
    m_vItems.push_back( strItem2 );
    m_mmAssociatedItems.insert( std::make_pair( it->second, m_vItems.at( m_uCount ) ) );
    ++m_uCount;
}

void MyClass::addItem( const std::string& strItem1, const std::string& strItem2 ) {
    // I need to do a similar thing as above instead of looking through my
    // const std::map at the key values for a match, with this overloaded
    // function call I need to use strItem1 as the search item to see if it
    // is within the contents of this map which would be the map's ->second
    // value. If not throw a similar error as above otherwise once it is 
    // found populate my vector and multimap same as above and increment 
    // my count variable.

    // This would logically be my next step
    const std::map<Count, const std::string>::const_iterator it = m_mCount.begin();

    // It Is Within This For Loop That It Fails To Compile! It
    // Fails At The it++ Part! Is There A Way Around This? Or
    // Am I Missing Something Simple?
    for ( ; it != m_mCount.end(); it++ ) {
    // If strItem1 == it->second && it != m_mCount.end()  
    // found it, add items, if not throw error           

    }

    m_vItems.push_back( strItem2 );
    m_mmAssociatedItems.insert( std::make_pair( strItem1, strItem2 ) );
    ++m_uCount;
}

在我的资料中,第二个功能比第一个功能更重要!非常感谢任何帮助或建议。

const std::map<Count, const std::string>::const_iterator it = m_mCount.begin();

应删除第一个 const。否则无法向前推进,无法遍历m_mCount.