Post

poj1208.方块问题

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 的外层,这不符合类型要求。

具体来说,vecvector<vector<int>>,而 vec.insert() 期待插入的元素类型应该是 vector<int>,而不是 int

错误代码段:

1
vec.insert(vec.begin() + 2, 3);

在这里,vecvector<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);
        }
    }
}

注意:

  1. 如果你想修改 vec 的内容,记得要传递 vec 的引用(&),否则函数内的操作不会影响到函数外的原始 vector
  2. 确保 ab 索引值不会越界。

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;
   }
This post is licensed under CC BY 4.0 by the author.