使用普通的C数组我会做类似的事情:
void do_something(int el, int **arr)
{
*arr[0] = el;
// do something else
}
现在,我想用vector替换标准数组,并在此处获得相同的结果:
void do_something(int el, std::vector<int> **arr)
{
*arr.push_front(el); // this is what the function above does
}
但它显示“表达式必须具有类类型”。如何正确地做到这一点?
答案 0 :(得分:30)
您可以通过引用传递容器,以便在函数中修改它。还没有解决的其他答案是std::vector
没有push_front
成员函数。您可以使用insert()
上的vector
成员函数进行O(n)插入:
void do_something(int el, std::vector<int> &arr){
arr.insert(arr.begin(), el);
}
或者使用std::deque
来代替摊销的O(1)插入:
void do_something(int el, std::deque<int> &arr){
arr.push_front(el);
}
答案 1 :(得分:18)
如果您定义函数以接受std::vector<int>& arr
参数和整数值,那么您可以在该函数中使用push_back
:
void do_something(int el, std::vector<int>& arr)
{
arr.push_back(el);
//....
}
用法:
std::vector<int> arr;
do_something(1, arr);
答案 2 :(得分:8)
void do_something(int el, std::vector<int> **arr)
应该是
void do_something(int el, std::vector<int>& arr)
{
arr.push_back(el);
}
通过引用传递已经简化为使用C ++中的&
。
答案 3 :(得分:3)
你可以通过引用传递矢量,就像这样:
void do_something(int el, std::vector<int> &arr){
arr.push_back(el);
}
但请注意,此函数始终在向量的后面添加新元素,而数组函数实际上修改第一个元素(或初始化它)。
为了达到完全相同的结果,你应该写:
void do_something(int el, std::vector<int> &arr){
if (arr.size() == 0) { // can't modify value of non-existent element
arr.push_back(el);
} else {
arr[0] = el;
}
}
通过这种方式,您可以添加第一个元素(如果向量为空)或修改其值(如果第一个元素已存在)。
答案 4 :(得分:0)
您不需要使用** arr,您可以使用:
void do_something(int el, std::vector<int> *arr){
arr->push_back(el);
}
或:
void do_something(int el, std::vector<int> &arr){
arr.push_back(el);
}
** arr毫无意义,但如果你坚持使用它,就这样做:
void do_something(int el, std::vector<int> **arr){
(*arr)->push_back(el);
}
但又没有理由这样做......