使用共享指针向量访问映射的映射中的元素

发布于 2024-11-27 20:41:08 字数 4705 浏览 1 评论 0原文

我有一个有点特殊的情况,我无法完全开始工作。

我已经遵循了很多使用映射的映射的示例,但是共享指针的向量似乎让我有点困惑。

假设我有以下内容:

typedef boost::shared_ptr<RecCounts> RecCountsPtr;
typedef std::vector<RecCountsPtr> RecCountsPtrVec;
typedef std::map<std::string, RecCountsPtrVec> InnerActivityMap;
typedef std::map< std::string, InnerActivityMap > ActivityMap;

其中 RecCounts 是一个简单的结构。

现在,我想我已经弄清楚如何正确填充我的 ActivityMap

RecCountsPtr recCountsPtr(new RecCounts());
config.actType = "M";
config.mapDate = "2010/07";

recCountsPtr->iHousehold = "50";
recCountsPtr->iZero = "150";

config.actMap[config.actType][config.mapDate].push_back(recCountsPtr);

是的?我没有收到任何编译/运行时错误...但由于我还没有弄清楚如何访问地图的所有不同元素,我无法确认这一点!

这是 config 结构:

struct Config
{
    std::string actType;
    std::string mapDate;

    // Map
    ActivityMap actMap;
    InnerActivityMap innerActMap;

    //Iterator
    ActivityMap::iterator actMapIter;
    InnerActivityMap::iterator innerActMapIter;
};

现在,假设我想访问 ActivityMap 的每个元素。我如何获得以下元素?

外层地图钥匙?

for (config.actMapIter= config.actMap.begin();
     config.actMapIter != config.actMap.end();
     ++config.actMapIter)
    {
        std::cout << "Outer Key = "
                  << (*config.actMapIter).first << std::endl;
    }

这似乎成功了。

内部地图Key? 我无法弄清楚这一点。

内部地图向量元素?

如果我知道这两个键,我可以这样做:

config.actMap[config.actType][config.mapDate][0]->iHouehold
config.actMap[config.actType][config.mapDate][0]->iZero

...但似乎无法弄清楚如何迭代它们。 :(

这就是我尝试迭代所有元素所做的事情。

for (config.actMapIter= config.actMap.begin();
         config.actMapIter != config.actMap.end();
         ++config.actMapIter)
    {
        std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;
        for (config.innerActMapIter = config.innerActMap.begin();
             config.innerActMapIter != config.innerActMap.end();
             ++config.innerActMapIter)
        {
            std::cout << "Inner Key = " 
                      << (*config.innerActMapIter).first << std::endl;
            for (size_t i = 0;
                 i < config.actMap[(*config.actMapIter).first]
                                  [(*config.innerActMapIter).first].size();
                 ++i)
            {
                std::cout << "iHousehold = "
                          << config.actMap[(*config.actMapIter).first]
                                          [(*config.innerActMapIter).first]
                                          [i]->iHousehold << std::endl;

                std::cout << "iZero = "
                          << config.actMap[(*config.actMapIter).first]
                                          [(*config.innerActMapIter).first]
                                          [i]->iZero << std::endl;
            }
        }
    }

我没有收到任何错误,但我只将外部键打印到屏幕上:

外键 = M

我怀疑我的内部迭代器出了问题……因为它与 ActivityMap 没有关联。即使我是正确的,我也不知道如何建立这样的关联。

有什么建议吗?

答案(感谢 crashmstr):

这是 crashmstr 建议的答案的详细版本。

for (config.actMapIter= config.actMap.begin();
     config.actMapIter != config.actMap.end();
     ++config.actMapIter)
{
    std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;

    InnerActivityMap innerActMap = (*config.actMapIter).second;
    InnerActivityMap::iterator innerActMapIter;

    for (innerActMapIter = innerActMap.begin();
         innerActMapIter != innerActMap.end();
         ++innerActMapIter)
    {
        std::cout << "Inner Key = " << (*innerActMapIter).first << std::endl;
        for (size_t i = 0;
             i < config.actMap[(*config.actMapIter).first][(*innerActMapIter).first].size();
             ++i)
        {
            std::cout << "iHousehold = "
                      << config.actMap[(*config.actMapIter).first]
                                      [(*innerActMapIter).first]
                                      [i]->iHousehold << std::endl;

            std::cout << "iZero = "
                      << config.actMap[(*config.actMapIter).first]
                                      [(*innerActMapIter).first]
                                      [i]->iZero << std::endl;
        }
    }
}

我将以下内容打印到屏幕上:

外键 = M

内键 = 2010/07

iHousehold = 50

iZero = 150

I have a somewhat unique situation that I can't quite get working.

I've followed a lot of examples of using maps of maps but the vector of shared pointers seems to throw me off a bit.

Suppose I have the following:

typedef boost::shared_ptr<RecCounts> RecCountsPtr;
typedef std::vector<RecCountsPtr> RecCountsPtrVec;
typedef std::map<std::string, RecCountsPtrVec> InnerActivityMap;
typedef std::map< std::string, InnerActivityMap > ActivityMap;

Where RecCounts is a simple structure.

Now, I think I've figured out how to populate my ActivityMap properly.

RecCountsPtr recCountsPtr(new RecCounts());
config.actType = "M";
config.mapDate = "2010/07";

recCountsPtr->iHousehold = "50";
recCountsPtr->iZero = "150";

config.actMap[config.actType][config.mapDate].push_back(recCountsPtr);

Yes? I don't get any compile/runtime errors for this...but since I haven't figured out how to access all the different elements of the map I can't confirm this!

This is the config structure:

struct Config
{
    std::string actType;
    std::string mapDate;

    // Map
    ActivityMap actMap;
    InnerActivityMap innerActMap;

    //Iterator
    ActivityMap::iterator actMapIter;
    InnerActivityMap::iterator innerActMapIter;
};

Now, suppose I want to access each element of the ActivityMap. How would I get the following elements?

The outer map Key?

for (config.actMapIter= config.actMap.begin();
     config.actMapIter != config.actMap.end();
     ++config.actMapIter)
    {
        std::cout << "Outer Key = "
                  << (*config.actMapIter).first << std::endl;
    }

This seemed to do the trick.

The inner map Key?
I can't figure this out.

The inner map vector elements?

I can do it like this if I know the two keys:

config.actMap[config.actType][config.mapDate][0]->iHouehold
config.actMap[config.actType][config.mapDate][0]->iZero

...but can't seem to figure out how to iterate through them. :(

This is what I've done to try and iterate through all elements.

for (config.actMapIter= config.actMap.begin();
         config.actMapIter != config.actMap.end();
         ++config.actMapIter)
    {
        std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;
        for (config.innerActMapIter = config.innerActMap.begin();
             config.innerActMapIter != config.innerActMap.end();
             ++config.innerActMapIter)
        {
            std::cout << "Inner Key = " 
                      << (*config.innerActMapIter).first << std::endl;
            for (size_t i = 0;
                 i < config.actMap[(*config.actMapIter).first]
                                  [(*config.innerActMapIter).first].size();
                 ++i)
            {
                std::cout << "iHousehold = "
                          << config.actMap[(*config.actMapIter).first]
                                          [(*config.innerActMapIter).first]
                                          [i]->iHousehold << std::endl;

                std::cout << "iZero = "
                          << config.actMap[(*config.actMapIter).first]
                                          [(*config.innerActMapIter).first]
                                          [i]->iZero << std::endl;
            }
        }
    }

I don't get any errors but I only get the outer key print to the screen:

Outer Key = M

I suspect something is amiss with my inner iterator...in that it's not associated the ActivityMap. Even if I am correct I don't know how to make such an association.

Any suggestions?

ANSWER (thanks to crashmstr):

Here is a verbose version of the answer suggested by crashmstr.

for (config.actMapIter= config.actMap.begin();
     config.actMapIter != config.actMap.end();
     ++config.actMapIter)
{
    std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;

    InnerActivityMap innerActMap = (*config.actMapIter).second;
    InnerActivityMap::iterator innerActMapIter;

    for (innerActMapIter = innerActMap.begin();
         innerActMapIter != innerActMap.end();
         ++innerActMapIter)
    {
        std::cout << "Inner Key = " << (*innerActMapIter).first << std::endl;
        for (size_t i = 0;
             i < config.actMap[(*config.actMapIter).first][(*innerActMapIter).first].size();
             ++i)
        {
            std::cout << "iHousehold = "
                      << config.actMap[(*config.actMapIter).first]
                                      [(*innerActMapIter).first]
                                      [i]->iHousehold << std::endl;

            std::cout << "iZero = "
                      << config.actMap[(*config.actMapIter).first]
                                      [(*innerActMapIter).first]
                                      [i]->iZero << std::endl;
        }
    }
}

I get the following printed to the screen:

Outer Key = M

Inner Key = 2010/07

iHousehold = 50

iZero = 150

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

っ左 2024-12-04 20:41:08

迭代地图时,.first 是“键”,.second 是属于该键的数据。

所以在你的情况下:

for (config.actMapIter= config.actMap.begin();
    config.actMapIter != config.actMap.end();
    ++config.actMapIter)
{
    std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;
    //(*config.actMapIter).second is a std::map<std::string, RecCountsPtrVec>
    //create a new for loop to iterate over .second
}

When iterating over a map, .first is the "key", and .second is the data that belongs to that key.

So in your case:

for (config.actMapIter= config.actMap.begin();
    config.actMapIter != config.actMap.end();
    ++config.actMapIter)
{
    std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;
    //(*config.actMapIter).second is a std::map<std::string, RecCountsPtrVec>
    //create a new for loop to iterate over .second
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文