C ++:循环中向量的问题

时间:2013-11-01 03:14:12

标签: c++ function vector while-loop

CreateList函数必须: 1.询问用户是否有杂货店名称。 2.要求用户输入该杂货店的物品清单,直到用户输入“完成”。 3.在输入字符串时将其添加到字符串向量中。 4.显示:“在杂货店名称列表中添加项目。”在每个项目输入后,其中“项目”是输入的项目,“杂货店名称”是在上面的步骤1中输入的名称。

void CreateList()
{   
    string store;
    string item;
    int count = 0;
    cout<<"What is the grocery store name"<<endl;
    cin>>store;
    vector<string> store;
    cout<<"Enter a list of items for this grocery store one at a time. When you are done, type done."<<endl;
    cin>>item;
    store[count] = item; //error saying no conversion?
    count++;
    cout<<"Added "<<item<<"to "<<store<<"list"<<endl;
    bool finished=true;
    while (finished = true)
    {
        cout<<"Enter a list of items for this grocery store one at a time. When you are done, type done."<<endl;
        cin>>item;

        if (item == "done")
        break;

        store[count] = item; //error saying no conversion?
        count++;
        cout<<"Added "<<item<<"to "<<store<<"list"<<endl;
}


}

对我的功能有几个问题,不确定无转换错误的来源,是否可以在do while循环中实现?请尽量让你的答案尽可能简单,这是我在从python过渡时第一次尝试C ++。谢谢你的时间。

4 个答案:

答案 0 :(得分:2)

你有很多错误。首先,你可以看到你重复了两次代码的大部分。这表明您应该重构代码。你对do {} while()的直觉是正确的,你绝对应该使用它。

其次,您不会像operator[]中那样通过store[count]将新项目推送到向量中。您应该使用store.push_back(item)store.emplace_back(item)。向量是一个动态容器,因此一旦创建它就不包含任何元素。尝试使用store[0]访问第一个元素将导致未定义的行为,并且很可能是分段错误。

第三,你可以看到你并没有真正使用那个finished变量(实际上你是用finished = true分配它而不是检查它是否为真,那就是{{1} })。因为您使用finished == true正确退出循环。因此,你一定要删除它。

第四,您将商店名称命名为break,并使用相同的名称来声明商店列表向量。您不应在同一代码块中对两种不同类型使用相同的名称。

最后,我发现您使用的是与store类似的内容。虽然这对于这种练习是可以接受的,但我认为习惯于使用using namespace std;标记库类的前缀是一个好主意,或者谨慎地仅“包含”您真正需要的命名空间:

std::

这主要是因为“污染”全局命名空间is considered bad practice的原因,我不会在这里讨论。

遵循上述指南,您可以获得类似的内容:

using std::string;
using std::cout;
// ...

答案 1 :(得分:0)

你有两个名为store的变量。一个是字符串,一个是字符串向量。然后,您似乎会混淆两者,将item分配给store[count],其中一个字符不是字符串,后来尝试输出产品列表,因为它是单个字符串。

使变量名有意义应该修复你的代码:

void CreateList()
{   
    std::string storeName;
    std::cout << "What is the grocery store name" << std::endl;
    std::cin >> storeName;

    std::cout << "Enter a list of items for this grocery store one at a time. When you are done, type done." << std::endl;

    std::vector<std::string> products;
    while (true)
    {
        std::string product;
        std::cin >> product;

        if (product == "done")
            break;

        products.push_back(product);

        std::cout << "Added " << product << " to " << storeName << " list" << std::endl;
    }
}

C ++继承了一个C编程的人工制品,它允许你用一个不同的同名变量“遮蔽”一个变量。

#include <iostream>

int i = 20;

int main() {
    int i = 10;
    for (int i = 0; i < 5; ++i) {
        std::cout << "loop i = " << i << std::endl;
    }
    std::cout << "i = " << i << std::endl;
}

现场演示:http://ideone.com/eKayzN

答案 2 :(得分:0)

首先你有2个不同的循环来读取你的值,但两者都或多或少都被破坏了,应该是一个循环。

此外,您在第二个循环中获得了一个赋值,并声明了两个名称为store的变量,其中一个为string,另一个为vector<string>。在同一范围内,不能有2个不同的同名变量。

我认为你真正想做的事情就是这样:

vector<string> CreateList()
{   
    string store;
    string item;
    cout<<"What is the grocery store name"<<endl;
    cin>>store;
    vector<string> store_list;
    cout<<"Enter a list of items for this grocery store one at a time. When you are done, type done."<<endl;

    while (cin>>item && item != "done") // read next item as long as input didn't fail and item isn't "done".
    {
        store_list.pushback(item); // using pushback for adding new item
        cout<<"Added "<< item <<"to "<< store << " list"<<endl;
    }

    return store_list

}

您可能还想以某种方式返回商店列表。

答案 3 :(得分:0)

嗯,vector是一个动态数组,但不像标准数组,你可以使用[]运算符访问指定索引的值,因为vector会重载[]运算符。但它返回您需要的const数据,您无法通过[]添加或修改数据。 您应该使用“store.push_back(item)”将项目添加到向量中,而不需要使用变量来保存总计数,向量将为您保存当前计数。您只需调用“store.size()”即可获得总计数。如果要修改指定索引的数据,可以使用“store.at(index)= value;”修改它。这是正确的代码:

void CreateList()
{   
    string storename; // use another name because you use store again below.
    string item;
    int count = 0;
    cout<<"What is the grocery store name"<<endl;
    cin>>storename;
    vector<string> store;
    cout<<"Enter a list of items for this grocery store one at a time. When you are done, type done."<<endl;
    cin>>item;
    **store.push_back(item);** //error saying no conversion?
    count++;
    cout<<"Added "<<item<<"to "<<store<<"list"<<endl;
    bool finished=true;
    while (finished == true)  // Here is not correct, use == to compare, not =. In fact , you use break to quit the loop, so you can just use while(1) or while(true) here. 
    {
        cout<<"Enter a list of items for this grocery store one at a time. When you are done, type done."<<endl;
        cin>>item;

        if (item == "done")
        break;

        **store.push_back(item);** //error saying no conversion?
        count++;
        cout<<"Added "<<item<<" to "<<storename<<" list"<<endl;
    }
}