cin 用于未知数量的物体?

Posted

技术标签:

【中文标题】cin 用于未知数量的物体?【英文标题】:cin for an unknown amount of objects? 【发布时间】:2012-10-16 02:13:46 【问题描述】:

对于一个项目,我必须创建一个队列,其中包含人员姓名、他们想要的服务数量以及他们想要的每项服务的列表。可以多次请求相同的服务。

基本上它的输入看起来像这样。

Dave 3 spa sauna pedicure
sarah 4 spa spa walk sauna
jim 1 walk
.

“。”表示我所有输入的结束。无论何时调用 walk,一旦他们行走,他们就不再想做其他任何事情并离开。所以在莎拉的情况下,她去了两次水疗中心,然后走路离开。她没有去她的桑拿浴室。

我的问题是我不知道我将如何实际输入信息。我假设我有一个表示人的类,但我不知道如何制作它,以便他们可以放置随机数量的人。如果只有 3 个人,我会使用 for 循环并将每个人保存到数组中的不同位置。

有什么方法可以简单地做到这一点吗?

【问题讨论】:

您可以杀死服务的数量部分,使用getline 输入每一行,提取名称,并使用容器的两个迭代器构造函数来使用他们需要的服务对其进行初始化。然后可以使用size() 访问该号码。 【参考方案1】:

您有最终用户输入的特殊符号,因此您可以要求输入,直到您获得此符号(“.”)。代码可以是这样的:

while(true)

    std::string name;
    std::cin >> name;

    if(name == ".")
        break;

    // number of services
    size_t n = 0;
    std::cin >> n;

    // list of services
    std::vector<std::string> services(n);
    for(size_t i = 0; i < n; ++i)
        std::cin >> services[i];

    // Here you can process user
    // You know user's name and have std::vector of his services

这段代码无限循环,直到用户名等于“.”。

如果您要输出所有用户或在列表中处理它们,则必须将它们存储在向量中。

struct User

    User(const std::string& _name):
        name(_name)
    
    

    std::string name;
    std::vector<std::string> services;
;

std::vector<User> users;

int main( )

    std::vector<User> users;

    while(true)
    
        std::string name;
        std::cin >> name;
        if(name == ".")
            break;

        users.push_back(User(name));

        size_t n = 0;
        std::cin >> n;

        for(size_t i = 0; i < n; ++i)
        
            std::string serviceName;
            std::cin >> serviceName;

            users.back().services.push_back(serviceName);
        
    

    for(size_t n = users.size(), i = 0; i < n; ++i)
    
        std::cout << users[i].name;
        std::cout << " ";
        std::cout << users[i].services.size();
        std::cout << " ";
        for(size_t s = users[i].services.size(), j = 0; j < s; ++j)
            std::cout << users[i].services[j] << " ";
        std::cout << std::endl;
    

    return 0;

此代码读取用户及其服务,然后将其打印回来。

如果您知道每个用户都在不同的行上,则可以有另一种方式来读取每个用户。

std::string l;
std::getline(std::cin, l);

std::istringstream ss(l);

std::string name;
ss >> name;
if(name == ".")
    break;

users.push_back(User(name));

size_t n = 0;
ss >> n;

for(size_t i = 0; i < n; ++i)

    std::string serviceName;
    ss >> serviceName;

    users.back().services.push_back(serviceName);

我正在从输入流 (cin) 中读取整行,然后创建字符串流 (ss) 并从中读取用户信息。

【讨论】:

谢谢。我不确定我将如何处理输入,但这似乎是我打算这样做的方式。我不确切知道如何显示每个截断,但这很好用。 @T.J.Williams 欢迎来到 SO。如果这解决了您的问题,您应该接受答案。如果它仍然有用,您应该投票。使用答案面板左侧的按钮。【参考方案2】:

读入名称,一旦他们输入操作的数量,他们将通过该数字执行循环。创建一个常量字符来表示每个可能的位置(据我所知,他们可以访问指定的位置)。如果下一次读取是步行,则结束循环。这是您的代码的一个非常粗略的大纲(根据我的理解),这是为了检查我的任何错误而匆忙完成的

    Declare consts ex:
        const string SPA = "spa";
        const string PEDICURE = "pedicure";
        //etc..etc..

    Decalre vars ex:
        int actions; //amount of actions
        //etc...e

tc..
WHILE name is not the dot

    prompt user for name
    read in name

    prompt user for amount of actions
    read in actions

    DO THIS
        prompt user for action
        read in action into string

        convert to lowercase(optional)
        compare action to possible places
            increment chosen place
        increment counter var(s)
    WHILE input is not walk and actions does not exceed max actions


display output

【讨论】:

【参考方案3】:

getline 很简单:

string line;
while(getline(cin,line))

    if (line.empty())
       break;
    file.push_back(line);

但是对于cin objects我找到了一种在最后中断的方法,不需要任何中断字符。您必须使用相同的变量来 cin 所有对象。使用后,您需要将其设置为默认退出值。然后检查下一个cin之后你的变量是否相同。示例:

string o;
while(true)
    cin>>o;
    if (o.compare("tmp")==0)
        break;
    // your normal code
    o="tmp";

【讨论】:

以上是关于cin 用于未知数量的物体?的主要内容,如果未能解决你的问题,请参考以下文章

pthread_join() 用于未知数量的线程

计算一行中空值的数量以除以(未知)列数

子类化 UIView 是处理未知数量的这些自定义对象的正确方法吗?

在Powershell中使用Select-String匹配未知数量的多行和未知数量的行?

获取子物体数量---Transform.childCount

创建未知数量的循环