vector的pop_back操作及重复名称分存vector需求咨询
解决Vector存储字符串与整数及元素弹出的问题
Hey there! Let's break down your problem step by step, including fixing your logic and clarifying how pop_back() works for vectors.
先明确你的核心需求
你想要实现的功能是:
- 将输入的名字(字符串)和分数(整数)分别存入两个独立的
std::vector(names存字符串,scores存整数) - 如果输入的名字已经存在于
names中,丢弃这个重复的输入(也就是删除刚输入的重复名字和对应的分数)
关于std::vector::pop_back()的正确用法
首先,pop_back()是std::vector的内置成员函数,用法很直白:
- 它不需要参数,直接调用就能删除vector的最后一个元素
- 它没有返回值,如果要获取最后一个元素再删除,得先调用
back()拿到值,再调用pop_back()删除 - 注意:调用
pop_back()前一定要确保vector不为空,否则会触发未定义行为(比如程序崩溃)
举个简单的使用例子:
std::vector<std::string> myVec = {"Alice", "Bob"}; // 获取最后一个元素 std::string lastItem = myVec.back(); // lastItem = "Bob" // 删除最后一个元素 myVec.pop_back(); // 现在myVec里只剩{"Alice"}
修正你的代码逻辑
看你给出的代码片段,存在一个关键逻辑错误:你在检查名字是否重复时,还没有把新输入的名字和分数加入vector,这时候调用pop_back()会删掉之前的最后一个元素,完全不符合你的需求。
下面是修正后的完整代码,既实现了你的需求,也正确展示了pop_back()的用法:
#include <iostream> #include <vector> #include <string> int main() { std::vector<std::string> names; std::vector<int> scores; std::string tempName; int tempScore; std::cout << "Enter name and score (enter NoName 0 to stop):" << std::endl; while (std::cin >> tempName >> tempScore) { // 终止输入的条件 if (tempName == "NoName" && tempScore == 0) { break; } // 检查当前名字是否已经存在 bool duplicateFound = false; for (const auto& existingName : names) { if (existingName == tempName) { duplicateFound = true; break; } } if (duplicateFound) { std::cout << "Error, duplicate name! This entry will not be saved." << std::endl; } else { // 无重复,同步添加到两个vector中 names.push_back(tempName); scores.push_back(tempScore); } } // 打印存储的所有条目,验证结果 std::cout << "\nAll stored entries:" << std::endl; for (size_t i = 0; i < names.size(); ++i) { std::cout << "Name: " << names[i] << ", Score: " << scores[i] << std::endl; } // 演示pop_back的用法(比如删除最后一个条目) if (!names.empty() && !scores.empty()) { std::cout << "\nDeleting the last entry..." << std::endl; names.pop_back(); scores.pop_back(); std::cout << "Entries after deletion:" << std::endl; for (size_t i = 0; i < names.size(); ++i) { std::cout << "Name: " << names[i] << ", Score: " << scores[i] << std::endl; } } return 0; }
额外场景:如果不小心先添加了重复项怎么办?
如果你因为某些原因,先把重复的名字和分数加入了vector,再发现重复,这时候就可以用pop_back()删除刚添加的元素:
// 错误地先添加了重复项 names.push_back(tempName); scores.push_back(tempScore); // 检查是否重复(跳过刚添加的最后一个元素,检查前面的内容) bool duplicateFound = false; for (size_t i = 0; i < names.size() - 1; ++i) { if (names[i] == tempName) { duplicateFound = true; break; } } if (duplicateFound) { std::cout << "Error, duplicate name! Removing the duplicate entry." << std::endl; // 同步删除两个vector的最后一个元素,保持数据匹配 names.pop_back(); scores.pop_back(); }
关键注意事项
- 始终保持两个vector的同步性:添加或删除元素时,
names和scores必须同时操作,否则会出现名字和分数不匹配的情况 - 调用
pop_back()前,一定要确认vector不为空,否则会导致程序崩溃或异常 - 先检查再添加是更高效的逻辑,能避免不必要的元素插入和删除操作
内容的提问来源于stack exchange,提问作者JimBob
相关产品推荐
相关产品推荐

