将地图数据的矢量复制到矢量地图中

时间:2012-08-17 22:14:24

标签: c++ vector iterator maps

很抱歉再次发布同样的问题,但我使用了建议的解决方案,部分工作... 所以我想澄清一下这个问题:

所以:

我定义了一个地图矢量,如下所示:

typedef vector<map<string,unsigned int> > myvec;

这样的矢量地图(我称之为索引):

typedef map<string,vector<unsigned int> > index;

然后我做了以下事情:

在我的班级,名为myCoogle,我宣布myvec maps_vec;

我填写了地图......

在每个地图中都有一个单词(字符串)和一个数字(unsinged int)。

到目前为止一切顺利。

我也声明了index the_index;

现在我想将所有不同的单词从the_vec复制到the_index。

单词将成为字符串......

对于每个矢量,我将添加存储在地图矢量中的数字。

例如:

the_vec有3张地图。

  第一个有:鸡,1 | 人,1 | 电梯,5 | 是,2 | ...

     

第二个有:人,2 | 冰淇淋,3 | 是,3 | ......

     第三个有:电梯,1 | 熊,1 | 是,4 | 鸡,3 | ...

所以the_index应该是这样的:

word,[ints of vector]

  

鸡[1,0,3]

     

人,[1,2,0]

     

电梯[5,0,1]

     

是[2,3,4]

     

冰淇淋[0,3,0]

     

熊[0,0,1]

好的,这是我的功能:

void Coogle::make_index()
{
    //SCAN THE FIRST MAP
    myvec::iterator myvec_iter;
    map<string,unsigned int>::iterator map_iter;
    index::iterator idx_iter = the_index.begin();
    for(map_iter=maps_vec[0].begin(); map_iter!=maps_vec[0].end(); ++map_iter)
    {
        the_index[map_iter->first].push_back(map_iter->second);
    }


    //SCAN THE OTHER MAPS
    myvec_iter=maps_vec.begin();
    myvec_iter++;
    int i=0; //FILE #
    while(myvec_iter!=maps_vec.end())
    {
        i++;
        for(map_iter=maps_vec[i].begin(); map_iter!=maps_vec[i].end(); ++map_iter)
        {
            string word=map_iter->first;
            cout << "DEALING WITH WORD \"" << word << "\"" << endl;
            index::iterator location;
            location=the_index.find(word);
            if(location!=the_index.end()) //if word found in the index
            {
                cout << "WORD EXISTS!" << endl;
                location->second[i]=map_iter->second;
            }
            else //if not found
            {
                cout << "WORD DOES NOT EXIST! NEW WORD." << endl;
                the_index[word].push_back(map_iter->second);
            }
        }
        cout << endl;
        ++myvec_iter;
    }
}

澄清:FILE#是地图编号......我正在使用文件(* .txt文件)。

好吧,在我扫描完第一张地图后,我试图打印the_index,一切都很好。 但是在扫描完扫描后我也得到了这个,其他地图:

the bug

'建立成功'虽然。

当我运行程序时会弹出这个窗口。

所以我相信我的第二个'for'循环出了问题。

任何人都可以帮忙吗?

非常抱歉很长的帖子......

非常感谢!!!

修改: 如果我不尝试打印the_index,程序编译并运行就好了。 但这还不够。 但我的打印功能还不错......在这里:

void Coogle::print_index() const
{
    index::const_iterator iter;
    for(iter=the_index.begin();iter!=the_index.end();++iter)
    {
        cout << "Word: " << iter->first << endl;
        //cout << "Files number is: " << files_number << endl; //prints: 3
        for(int i=0; i<files_number;i++)
            cout << "file #" << i+1 << ": " << iter->second[i] << " , " << endl;
    }
}

修改

以下是仅打印1张地图与打印3张地图的屏幕截图:

1 map vs 3

2 个答案:

答案 0 :(得分:0)

编辑:好的,希望我终于明白你要做的是什么。

typdef myvec::iter vmiter_t;
typdef map<string,unsigned int>::iter miter_t;
typdef set<string>::iter siter_t;

set<string> words;

for(vmiter_t vmiter=maps_vec.begin(); vmiter != maps_vec.end(); ++vmiter)
{
    for(miter_t miter = vmiter->begin(); miter != vmiter->.end(); ++miter)
    {
        words.insert(miter->first);
    }
}

for (siter_t iter=words.begin(); iter!=words.end(); ++iter){
    const string& word = *iter;
    for(vmiter_t vmiter=maps_vec.begin(); vmiter != maps_vec.end(); ++vmiter)
    {
        map<string,unsigned int>& temp = *vmiter;
        the_index[word].push_back(temp[word]);
    }
}

很难说,因为你没有提供你的变量声明(其中一些似乎被错误命名),但我认为问题是行location->second[i]=map_iter->second;。你试图在向量中访问索引i,但你的向量实际上并不长。

编辑:既然我可以告诉你实际上要做什么,那么你就会大肆过分复杂化。你根本不需要为其他元素分别进行循环。

答案 1 :(得分:0)

这是一个C ++ 11答案:

myvec v = /* ... */;

index q;

for (auto const & m : v)
    for (auto const & p : m)
        q[p->first].emplace_back(p->second);

它与@ Antimony的解决方案相同,只是稍微容易一点。