在 C++ 中填充和删除元素形成向量和映射

Filling and removing elements form vector and map in c++

这是我的问题:

  1. 用 1 到 9 的随机数填充向量和地图
  2. 从两者中删除最多15个元素的随机数
  3. 然后删除除相同元素以外的所有元素(保留重复元素)

除 void keepTheSame() 外,所有函数或多或少都在完成它们的工作。我收到矢量下标超出范围错误。我知道我做错了什么但无法解决。 如果有人可以提供帮助,请这样做。仍在学习过程中...


完整代码:

#include "stdafx.h"
#include <iostream>
#include "math.h"
#include <vector>
#include <map>

using namespace std;


void fillVecFunction(vector<int>& vec,int size)
{
    int randomNumber;
    for(int i=0; i<size; i++)
    {
        randomNumber=1+rand()%9;    
        vec.push_back(randomNumber);
    }
}

void printVecFunction(vector<int>& vec)
{
    for(vector<int>::const_iterator i = vec.begin(); i != vec.end(); ++i)
        cout << *i << " ";
    cout<<" DONE PRINTING VECTOR!"<<endl<<endl;
}

void fillMapFunction(map<int,int>& map, int size)
{
        for(int i=0; i<size; i++)
    {
        map[i]=1+rand()%9;
    }
}
void printMapFunction(map<int,int>& map,int size)
{
    for(int i=0; i<size;i++)
    if(map[i]!=0)
        cout<<map[i]<<" ";
    cout<<"DONE PRINTING MAP!"<<endl<<endl;
}
void delElements(map<int,int>& map, vector<int>& vec,int size)
{
    int randomNumToRemove=5+rand()%15;
    cout<<"REMOVING : "<<randomNumToRemove<<" ELEMENTS"<<endl<<endl;

    vec.erase(vec.begin(),vec.begin()+randomNumToRemove);   

    std::map<int,int>::iterator it;
    it=map.begin();
    while(randomNumToRemove)
    {
        map.erase(it++);
        randomNumToRemove--;
    }
}

void fillMapFromVec(vector<int>& vec,int size)
{
    map<int,int> NewMap;

    for(int i=0; i<size; i++)
        NewMap[i]=vec[i];
    printMapFunction(NewMap,size);
}
void keepTheSame(map<int,int>& map,vector<int>& vec,int sizeMap, int sizeVec)
{
    vector<int> tempV,tempM;
    int counterM=0,counterV=0;
    for(int i=0; i<sizeVec;i++){
        for(int j=0; j<sizeMap; j++)
        {

            if(vec[i]==map[j])
            {
                //tempM[counterM]=map[17];
                counterM++;
            }
        }
        if(counterM>counterV)
        {
            tempV[counterV]=vec[i];
            counterV++;
        }

    }

    cout<<counterM<<" "<<counterV;
    //printVecFunction(tempV);
    //fillMapFromVec(tempM,sizeof(tempM)+sizeof(int)*tempM.capacity());
}

int _tmain(int argc, _TCHAR* argv[])
{

    int MAX=20;

    vector<int> vec;
    fillVecFunction(vec,MAX);
    printVecFunction(vec);

    map<int,int> map;
    fillMapFunction(map, MAX);
    printMapFunction(map,MAX);

    delElements(map,vec,MAX);
    printVecFunction(vec);
    printMapFunction(map,MAX);

    keepTheSame(map,vec,map.size(),vec.size());


    system("PAUSE");
    return 0;
}

这个:

tempV[counterV]=vec[i];
counterV++;

正在写入未初始化的内存。 tempV 的大小始终为零,因此您的下标问题。附加到矢量时,您需要执行:

tempV.push_back(vec[i]);

不需要 counterV