如何交换vector中的值?求指定映射交换的实现方案
实现Vector中指定规则的值交换映射
没问题,我来帮你搞定这个vector值的映射交换需求!核心思路很简单:我们要把vector里的每个元素,按照1→3、2→4、3→2、4→1的规则做替换,本质就是一个值到值的映射转换,下面给你几种实用的实现方式,挑你顺手的来就行:
方法1:用数组做映射(最高效,适合值范围小的场景)
因为你的映射值都是1-4的连续整数,用数组做映射是最快的——直接通过原数值当索引取目标值,时间复杂度O(1):
#include <vector> #include <iostream> int main() { std::vector<int> vec = {1, 2, 3, 4, 1, 3}; // 索引对应原数值,数组值对应替换后的目标值,索引0留空(因为我们的原数值从1开始) int mapping[] = {0, 3, 4, 2, 1}; // 遍历vector,逐个替换 for (int& num : vec) { num = mapping[num]; } // 测试输出:3 4 2 1 3 2 for (int num : vec) { std::cout << num << " "; } return 0; }
这种方法在元素数量多的时候优势特别明显,完全没有哈希查找的开销。
方法2:用哈希表(std::unordered_map)做映射(更灵活,适合值范围大的场景)
如果以后你的映射规则要扩展到非连续的数值,用哈希表会更灵活,可读性也更强:
#include <vector> #include <unordered_map> #include <iostream> int main() { std::vector<int> vec = {1, 2, 3, 4, 1, 3}; // 直接把映射规则写进哈希表 std::unordered_map<int, int> mapping = { {1, 3}, {2, 4}, {3, 2}, {4, 1} }; for (int& num : vec) { num = mapping[num]; } // 测试输出:3 4 2 1 3 2 for (int num : vec) { std::cout << num << " "; } return 0; }
以后要加新的映射对,直接在哈希表里追加就行,不用改太多代码。
方法3:用switch-case判断(适合规则极简单的场景)
如果你的映射规则就只有这4条,用switch-case也能搞定,不需要额外容器:
#include <vector> #include <iostream> int main() { std::vector<int> vec = {1, 2, 3, 4, 1, 3}; for (int& num : vec) { switch(num) { case 1: num = 3; break; case 2: num = 4; break; case 3: num = 2; break; case 4: num = 1; break; // 如果vector里可能有1-4之外的值,记得加default处理(比如保持原值) default: break; } } // 测试输出:3 4 2 1 3 2 for (int num : vec) { std::cout << num << " "; } return 0; }
小提醒
如果你的vector里可能存在1-4之外的数值,一定要加对应的处理逻辑(比如switch里的default,或者哈希表中判断是否存在键),避免出现未定义行为哦!
内容的提问来源于stack exchange,提问作者Gilgamesh
相关产品推荐
相关产品推荐

