You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:55:14