如何创建元素相同顺序不同的两个vector?及元素联动修改的实现疑问
关于std::vector的两个问题解答
1. 如何创建包含相同元素但顺序不同的两个std::vector?
有几种实用的实现方式:
直接初始化:通过初始化列表直接指定不同顺序的元素,适合元素数量较少的场景:
std::vector<double> temp_1 = {1, 4}; std::vector<double> temp_2 = {4, 1}; // 直接按逆序初始化拷贝后调整顺序:先拷贝原vector,再借助标准库算法调整元素顺序,比如反转或随机打乱:
#include <algorithm> #include <vector> std::vector<double> temp_1 = {1, 4, 2, 3}; std::vector<double> temp_2 = temp_1; std::reverse(temp_2.begin(), temp_2.end()); // 反转后temp_2为{3,2,4,1} // 若要随机打乱顺序,可添加随机数生成器 // std::random_device rd; // std::mt19937 g(rd()); // std::shuffle(temp_2.begin(), temp_2.end(), g);手动赋值元素:像你示例中那样,逐个将原vector的元素按目标顺序赋值给新vector:
std::vector<double> temp_1 = {1, 4}; std::vector<double> temp_2; temp_2.resize(2); // 示例中resize(3)但仅用到前两个元素,可调整为2 temp_2[0] = temp_1[1]; temp_2[1] = temp_1[0];
2. 是否可以基于一个std::vector的元素创建另一个std::vector,使得修改其中一个的元素时另一个也随之改变?
普通std::vector无法实现,因为std::vector存储的是元素的值拷贝,两个vector的元素位于独立内存空间。比如你提供的代码示例中,temp_2[1] = temp_1[0]是把temp_1[0]的当前值(1)拷贝给temp_2[1],后续修改temp_1[0]为55时,temp_2[1]的值不会自动更新为55,实际运行结果应为temp_2 = [4, 1],而非示例中的[4,55]。
如果要实现修改同步,需要让两个容器存储指向原元素的引用或指针:
方法1:使用std::reference_wrapper
通过std::vector<std::reference_wrapper<double>>存储原vector元素的引用:
#include <vector> #include <functional> // 包含std::reference_wrapper std::vector<double> temp_1 = {1, 4}; // 创建存储引用的vector,按目标顺序指向temp_1的元素 std::vector<std::reference_wrapper<double>> temp_2; temp_2.push_back(temp_1[1]); temp_2.push_back(temp_1[0]); temp_1[0] = 55; // 此时temp_2对应的元素值为[4,55],与temp_1的修改同步
方法2:存储指针
使用std::vector<double*>存储原元素的指针:
#include <vector> std::vector<double> temp_1 = {1, 4}; std::vector<double*> temp_2; temp_2.push_back(&temp_1[1]); temp_2.push_back(&temp_1[0]); temp_1[0] = 55; // 访问temp_2元素需解引用:*temp_2[0] =4,*temp_2[1]=55
注意:使用引用或指针时,需确保原vector的元素内存不会被提前释放(比如原vector不被销毁、不触发重新分配内存导致迭代器失效),否则会出现悬空引用/指针问题。
内容的提问来源于stack exchange,提问作者DiA
相关产品推荐
相关产品推荐

