如何在C++中实现“不在数组中”的判断逻辑?
在C++中实现“判断字符是否在数组中,不存在则添加”的功能
嘿,我完全懂你的感受——Python里not in那种一句话搞定的语法确实太省心了,换到C++里突然要手动处理查找,确实容易懵。不过别担心,我们可以用标准库的工具轻松实现和你Python代码一样的逻辑。
先回顾下你的需求:遍历字符串数组word_arr,对每个字符串,检查其第input_pos位的字符(前提是字符串长度够),如果这个字符不在vowel_arr里,就把它加进去。
方法一:用std::vector(最接近Python列表的用法)
C++里的std::vector和Python的列表很像,我们可以用<algorithm>头文件里的std::find函数来实现“是否存在”的判断。
完整代码示例:
#include <vector> #include <string> #include <algorithm> #include <iostream> int main() { // 初始化你的字符串数组 std::vector<std::string> word_arr = {"c", "co", "cmo", "cmop","cmopu","cmoptu", "cemoptu", "cemoprtu"}; std::vector<char> vowel_arr; // 对应你的vowel_arr int input_pos = 2; // 假设你要检查的位置是2,可根据实际情况修改 for (const auto& word : word_arr) { // 先检查字符串长度是否足够,避免越界访问 if (word.size() > input_pos) { char target_char = word[input_pos]; // 用std::find查找字符是否在vowel_arr中 if (std::find(vowel_arr.begin(), vowel_arr.end(), target_char) == vowel_arr.end()) { vowel_arr.push_back(target_char); std::cout << "添加了字符: " << target_char << std::endl; } } } // 输出最终的vowel_arr std::cout << "最终的vowel_arr: "; for (char c : vowel_arr) { std::cout << c << " "; } std::cout << std::endl; return 0; }
这段代码里,std::find(vowel_arr.begin(), vowel_arr.end(), target_char) == vowel_arr.end()就完全等价于Python里的target_char not in vowel_arr——如果find遍历到数组末尾都没找到目标字符,就说明它不存在。
方法二:用std::unordered_set(更高效的查找)
如果你的vowel_arr会有很多元素,用std::vector的find每次都是线性遍历(O(n)时间),效率会比较低。这时候可以用std::unordered_set,它的查找平均是O(1)时间,适合频繁的存在性检查:
#include <unordered_set> #include <vector> #include <string> #include <iostream> int main() { std::vector<std::string> word_arr = {"c", "co", "cmo", "cmop","cmopu","cmoptu", "cemoptu", "cemoprtu"}; std::unordered_set<char> vowel_set; // 用set代替vector int input_pos = 2; for (const auto& word : word_arr) { if (word.size() > input_pos) { char target_char = word[input_pos]; // insert函数会返回一个pair,second表示是否成功插入(即之前不存在) auto [iter, inserted] = vowel_set.insert(target_char); if (inserted) { std::cout << "添加了字符: " << target_char << std::endl; } } } // 如果需要转成vector,也很简单 std::vector<char> vowel_arr(vowel_set.begin(), vowel_set.end()); std::cout << "最终的vowel_arr: "; for (char c : vowel_arr) { std::cout << c << " "; } std::cout << std::endl; return 0; }
这里vowel_set.insert(target_char)会自动处理“不存在才添加”的逻辑,返回的inserted变量会告诉我们这次是否真的插入了新元素,和你要的逻辑完全匹配。
关键注意点
- 边界检查:一定要先判断
word.size() > input_pos,C里直接访问超出字符串长度的索引会导致未定义行为(程序崩溃或奇怪的错误),这一点和Python不一样,Python会直接抛出IndexError,但C不会,所以必须手动检查。 - 头文件依赖:使用
std::find需要包含<algorithm>,使用std::unordered_set需要包含<unordered_set>,别忘了加这些头文件。
内容的提问来源于stack exchange,提问作者handavidbang
相关产品推荐
相关产品推荐

