搜索const std :: map

时间:2015-03-17 16:41:46

标签: c++ const std const-iterator

我正在上一堂课,我遇到了绊脚石。我会给你一个我的源代码示例,只有类,方法和变量名的名称不同,但实现是一样的。你会看到我的问题,问题/ s&在代码块中关注/ 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;
}

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

1 个答案:

答案 0 :(得分:4)

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

应删除第一个const。否则它无法向前移动,您无法遍历m_mCount