在 C++ 中填充和删除元素形成向量和映射
Filling and removing elements form vector and map in c++
这是我的问题:
- 用 1 到 9 的随机数填充向量和地图
- 从两者中删除最多15个元素的随机数
- 然后删除除相同元素以外的所有元素(保留重复元素)
除 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
。
这是我的问题:
- 用 1 到 9 的随机数填充向量和地图
- 从两者中删除最多15个元素的随机数
- 然后删除除相同元素以外的所有元素(保留重复元素)
除 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
。