[英]allocate an element vector to vector
这是我写的段函数:
vector<int> v1(const vector<int> &v2, const vector<int> &v3) {
int v2_index = 0;
int v3_index = 0;
int v1_INDEX = 0;
for(int i=0; i < v3.size(); ++i) {
if(v2[v2_INDEX] == v3[v3_INDEX]) {
int x= v2[v2_INDEX];
v1[v1_INDEX] = x;
++v1_INDEX;
}
if (v2[0] != v3[0]) {
v2_INDEX++;
}
v3_INDEX++;
}
}
我必须使用向量作为函数。 如果 v2 元素等于 v3 元素,我想为 v1 向量分配一个元素(不重复;push_back 或 v2[0]= v1[0]):
我试过了:
v1.push_back(v2.push_back(i));
v1[v1_INDEX] = v2[v2_index];
int x = v2[v2_index]; v1.push_back(x);
v1[v2[v2_index]];
他们都没有编译。 为什么我可以在不使用额外库的情况下将元素 v2[i] 正确分配给 -----> v1[i]?
我收到以下错误:
error: request for member ‘push_back’ in ‘v1’, which is of non-class type
问题的关键在于,在 C++ 中,与Pascal不同,函数通过使用return
语句返回值。 在 C++ 中,不可能通过函数名访问返回的对象。 在您的代码中:
v1[v1_index] = x;
v1
指的是函数本身,而不是返回的对象。 因此,代码尝试访问函数v1
是它是数组还是向量。 这是没有意义的,因此错误:
<source>: In function 'std::vector<int> v1(const std::vector<int>&, const std::vector<int>&)':
<source>:12:19: warning: pointer to a function used in arithmetic [-Wpointer-arith]
v1[v1_index] = x;
^
要获得您想要的功能,您需要定义返回的对象,并在最后返回它:
vector<int> v1(const vector<int> &v2, const vector<int> &v3) {
int v2_index = 0;
int v3_index = 0;
int v1_index = 0;
vector<int> ret;
for(int i=0; i < v3.size(); ++i) {
if(v2[v2_index] == v3[v3_index]) {
int x= v2[v2_index];
// Bug: out of bounds
ret[v1_index] = x;
++v1_index;
}
if (v2[0] != v3[0]) {
v2_index++;
}
v3_index++;
}
return ret;
}
这可以编译,但您仍然有一个严重的错误。 该错误正在访问ret
越界。 更好的解决方案是v1_index
并简单地调用push_back()
代替:
int x= v2[v2_index];
ret.push_back(x);
更好的是,使用 range-for 循环代替v3_index
变量的所有混乱。 它很简单:
for (auto v3_element: v3) {
... your code goes here...
}
无需维护索引,也无需访问v3[...]
。 这一切都由for
为您完成。 不幸的是,由于v2_index
递增的方式,您无法摆脱它,但不需要其他索引变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.