如何计算存储在地图中的向量中存储的元素数量

时间:2016-11-11 17:12:08

标签: c++

我有四个静态向量。在我的.cpp文件中(不是我的.h文件!)我将这些向量定义为:

     std::vector<Object*> ClassA::vecA;
     std::vector<Object*> ClassA::vecB;
     std::vector<Object*> ClassA::vecC;
     std::vector<Object*> ClassA::vecD;

然后我用一些Object类型的对象填充这些向量中的每一个。

接下来我创建一个地图:

     std::map<std::string, std::vector<Object*> > cntr;

我使用上面的向量填充此地图,并使用字符串作为每个向量的键。

问题是,如何访问地图中的向量以找出它们包含的元素数量。我试过了:

     for (it = Cntr.begin(); it != Cntr.end(); it++) 
     {
        if (it->first != token)
        {
         std::cout << it->first << std::endl;

            int i = (it->second).size();

            std::cout << "SIZE: "      << i << std::endl;

        }
    }

但是我总是给我1的值。正确的方法是什么?

2 个答案:

答案 0 :(得分:2)

首先,您需要将迭代器设置为指向地图的有效元素。当你这样做

std::map<std::string, std::vector<Object*>>::iterator Class::it;
int size = it->second.size();

it并未指向任何内容,因此使用它是未定义的行为。你可以做的是使用

std::map<std::string, std::vector<Object*>>::iterator Class::it;
it = cntr.begin();
int size = it->second.size();

现在可以为您提供地图中第一个矢量的大小。

如果你想获得所有尺寸,那么你需要遍历地图。你可以使用一个很好的基于范围的循环来完成这个

for (const auto & elem : cntr) // get a const reference to each pair
    std::cout << elem.second.size();

答案 1 :(得分:0)

如果你有C ++ 11,NathanOliver的答案应该有效。如果不这样做,可以尝试使用typedef来清除代码:

typedef std::vector<Object*> MypObjVec;
typedef std::map<std::string, MypObjVec> MyMap;

MyMap::iterator Class::it = cntr.begin();
const MyMap::iterator Class::it_end = cntr.end();

for(; it!=it_end ; ++it)
{
   std::cout<< it->second.size() << std::endl;
}