有没有一种优雅的方法可以使用向量修改器并获得新的向量,而不是更改原始向量
Is there an elegant way of using a vector modifier and getting a new vector instead of changing the original one?
我发现自己一直在做的一种模式是:
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);
相关文章:
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- C++ 合并排序返回原始向量
- 使用字节向量作为其他类型的原始存储是一种好的做法吗
- C++模板,用于通过常量引用和原始指针传递向量
- 有没有一种优雅的方法可以使用向量修改器并获得新的向量,而不是更改原始向量
- 原始指针在放置并推送到智能指针向量时是否会自动转换为智能指针?
- 如何在 C++ 中从向量中删除重复项(具有原始值)
- 使用原始字节向量作为提升序列化的存档的任何方法
- 通过引用传递向量的值在传递的原始向量中不会改变
- 如何在保留原始索引的同时对向量的向量进行排序
- 将原始指针向量清除给由独特指针拥有的对象
- 从两个原始向量创建一个“特征::矩阵”
- SWIG:返回原始指针与共享指针的向量
- 使用来自 unique_ptr 向量的原始指针作为排序的 ID
- 如何在跟踪原始索引的同时压缩向量(具有重复项)
- 为什么我的选择排序返回原始向量中不在的值
- 子向量修改原始向量
- 在std::向量中表示原始字节的最佳方式
- 在公共方法中使用 pop_back(),但是一旦我退出该方法,向量就会返回到原始方法
- C++快速排序向量并保留原始索引号