如何让C++二维Vector切片的修改同步至原容器?
如何让sub的修改同步到原vector容器?
当前代码中,通过迭代器范围构造的sub是原容器block_values的拷贝,修改sub不会影响原容器。需要让sub作为原容器的视图或引用,实现修改同步。
问题原因
你当前初始化sub的方式:
vector<std::vector<int>> sub = vector<std::vector<int>>(block_values.begin() + 1, block_values.begin()+3);
会创建一个新的vector容器,其中的每个vector<int>都是原容器对应元素的拷贝。因此对sub的修改只会作用于这些拷贝,不会同步到block_values。
解决方案
方案1:使用C++20 std::span(推荐)
std::span是C++20引入的非拥有式视图,直接引用原容器的一段连续范围,不需要拷贝数据,修改span内的元素会直接修改原容器。
修改步骤:
- 包含span头文件:
#include <span> - 将
sub定义为span类型:
std::span<std::vector<int>> sub(block_values.begin() + 1, block_values.begin() + 3);
- 调整函数参数以支持span(或保持原引用参数,span可隐式转换为vector的引用):
// 修改print_vec为接受span(兼容const场景) void print_vec(std::span<const std::vector<int>> v) { cout << "**********print start!!!**********" << endl; for (const auto& row : v) { for (int num : row) { cout << num << " "; } cout << endl; } cout << "**********print end!!!**********" << endl; } // 修改change_vec为接受span void change_vec(std::span<std::vector<int>> v) { for (auto& row : v) { for (int& num : row) { num *= 10000; } } }
修改后运行,对sub的修改会直接同步到block_values,最终输出中block_values的第2、3行(对应原索引1、2)会变为970000 960000和950000 940000。
方案2:使用指针容器(兼容C++20之前版本)
如果无法使用C++20,可以存储原容器元素的指针,通过指针修改原容器的元素。
修改步骤:
- 将
sub定义为存储vector<int>*的容器:
vector<vector<int>*> sub; for (auto it = block_values.begin() + 1; it != block_values.begin() + 3; ++it) { sub.push_back(&(*it)); }
- 调整函数以支持指针容器:
void print_vec(const vector<vector<int>*>& v) { cout << "**********print start!!!**********" << endl; for (const auto* row : v) { for (int num : *row) { cout << num << " "; } cout << endl; } cout << "**********print end!!!**********" << endl; } void change_vec(vector<vector<int>*>& v) { for (auto* row : v) { for (int& num : *row) { num *= 10000; } } }
此方案同样能实现修改sub时同步更新block_values的效果。
内容的提问来源于stack exchange,提问作者user11578
相关产品推荐
相关产品推荐

