poj1208.方块问题
ps:这题的教训是,做题之前一定要[在纸上把思路写下来,尤其选好数据结构,否则就是半天无用功!!!]
这里记录一些vector的细节:插入元素的方法、vector双重数组,以及[引用传参]
Q1:vector插入元素
1
2
3
4
5
6
7
8
void moveOnto(vector<vector<int>>vec,int a,int b){
for(int i=0;i<vec.size();i++){
if(vec[a][i]!=-1){
int val=vec[a][i];
vec.insert(vec.begin() + 2, 3);
}
}
为什么提示 ”没有与参数列表匹配的 重载函数 “?
A1:
问题的根源在于你试图向二维 vector
中插入元素时,调用了错误的 insert
方法。你正在处理的是 vector<vector<int>>
,也就是一个二维向量。错误提示是因为你试图将一个 int
类型插入到二维 vector
的外层,这不符合类型要求。
具体来说,vec
是 vector<vector<int>>
,而 vec.insert()
期待插入的元素类型应该是 vector<int>
,而不是 int
。
错误代码段:
1
vec.insert(vec.begin() + 2, 3);
在这里,vec
是 vector<vector<int>>
,而你试图插入的是一个 int
类型的元素(3
),这与类型 vector<int>
不匹配。
解决方法:
如果你要在二维 vector
的某个子 vector
中插入元素,你应该首先访问到那个子 vector
,然后再对该子 vector
进行操作。
假设你要在 vec[a]
中插入 3
,正确的做法应该是:
1
vec[a].insert(vec[a].begin() + 2, 3);
这样你是对 vec[a]
这个一维 vector
进行插入操作,而不是对整个二维 vector
进行操作。
改正后的代码:
1
2
3
4
5
6
7
8
9
void moveOnto(vector<vector<int>>& vec, int a, int b) {
for (int i = 0; i < vec[a].size(); i++) {
if (vec[a][i] != -1) {
int val = vec[a][i];
// 在 vec[a] 的第 2 个位置插入 3
vec[a].insert(vec[a].begin() + 2, 3);
}
}
}
注意:
- 如果你想修改
vec
的内容,记得要传递vec
的引用(&
),否则函数内的操作不会影响到函数外的原始vector
。 - 确保
a
和b
索引值不会越界。
PS1
vector的 insert ( p,e ) 函数的第一个表示插入位置的参数p 是个指针,而不是下标!
所以如果写成vec.insert(3,3)
会报错的。如果要向vector插入一个值为3的元素,作为其第三个元素,那么参数p应该写成vec.insert(vec.begin()+2,3)
,注意这里是+2
而不是+3!
Q2:引用传参
我这个moveOnto函数为什么没效果?
3
0 -1 -1
1 -1 -1
2 -1 -1
move
0
onto
1
0 -1 -1
1 -1 -1
2 -1 -1
A2:你的 moveOnto
函数之所以没有效果,是因为你传递 vector<vector<int>>
时没有使用[引用传参]。
当你修改 vec
的内容时,其实是在修改这个副本,而原始的 vec
没有受到影响。要解决这个问题,可以将 vector<vector<int>>
改为引用传递,即使用 &
来传递原始的 vec
。
1
void moveOnto(vector<vector<int>>& vec, int a, int b)
PS2:要养成习惯:不管什么函数,都要使用[引用传参]
Q3:vector二维数组
1
2
//创建一个n×n、全都初始化为0的二维数组
ector<vector<int>> vec(n,vector<int>(n,0));
其中第一个参数n是作为vec的元素的一维数组的个数,第二个参数vector<int>(n,0)实际上又是一个一维的vector,其中n是这个一维数组的元素个数,全部用0初始化
因为第二个参数的作用就是用来初始化vector元素的,这里用vector<int>(n,0)来初始化vec的元素、用0来初始化vec[i]的元素
1
2
3
4
5
6
7
8
9
10
//输出二维数组的所有元素
for(int i=0;i<vec.size();i++){
cout<<i<<": ";
for(int j=0;j<vec.size();j++){
if(vec[i][j]!=-1){
cout<<vec[i][j]<<" ";
}
}
cout<<endl;
}