有没有一种优雅的方法可以使用向量修改器并获得新的向量,而不是更改原始向量

Is there an elegant way of using a vector modifier and getting a new vector instead of changing the original one?

本文关键字:向量 原始 有没有 一种 可以使 方法 修改器      更新时间:2023-10-16

我发现自己一直在做的一种模式是:

vector<int> v = {1,2,3};
vector<int> v_copy = v;
v_copy.pop_back();
a_function(v_copy);

有办法在两行中完成这项工作吗?我希望有这样的东西:

vector<int> v = {1,2,3};
a_function(v.without_back());

谢谢。

此外,如果您对vector::push_back或std::transform((等其他情况有任何想法,我将不胜感激!

试试这个:

a_function(std::vector<int>(v.begin(), v.end() - 1));

Walid Jabari答案中的替代语法:

void foo(std::vector<int> v) { ... }
std::vector<int> v{1, 2, 3};
foo({v.begin(), v.end() - 1});

注意:有些人写--v.end()而不是v.end() - 1。例如,如果v.end()返回一个普通指针,而该指针是std::vector的有效迭代器,则此操作可能失败。v.end()返回一个右值,而operator--不能应用于基本类型的右值。

这就是函数的作用。

template <typename T>
std::vector<T> withoutLast(std::vector<T> vec)
{
if (!vec.empty())
vec.pop_back();
return vec;
}
int main()
{
std::vector<int> v = {1,2,3};
a_function(withoutLast(v));
}

或者让a_function取一个范围。

您可以做一些小技巧来更改函数,添加一个offset参数:

void a_function(vector<int> v, int offset = 0){
for(int i = 0; i < v.size() - offset; i++){
//do something
}
}

如果你想迭代到最后一个位置之前,你可以做

vector<int> v = {1,2,3};
a_function(v_copy, 1);