C ++中的向量初始化?

时间:2015-11-27 20:02:27

标签: c++ vector

我对C ++ /编码比较陌生,我正在为CS2做最后的项目。我正在尝试设计一个“食谱计算器”,它将采用3种成分(进入载体),然后在食谱数据库中搜索潜在的食谱。

目前,我正在努力解决一些基础问题,当我调用初始化矢量的函数时,它不会再在主函数中输出成分。 当我尝试在实际函数内输出向量时,它可以工作。但我想确保相同的矢量保存在主要的“ingreds”中。

int main()
{
    int y;
    cout << "Hello! Welcome to Abby's Recipe Calculator." << endl << endl;
    cout << "Please select an option: 1 to search by ingredient or 2 to browse recipes..." << endl;
    cin >> y;

    vector <string> ingreds;
    ingreds.reserve(4); 

    if (y == 1)
    {
        ingredientvector(ingreds);
        for (int i = 0; i < ingreds.size(); i++)
        {
            std::cout << ingreds[i];
        }
    }


    //else if (y == 2)
    //{
    //call recipe function... 
    //}

    system("pause");
    return 0;
}

vector<string> ingredientvector(vector<string> x)
{
    cout << "SEARCH BY INGREDIENT" << endl;
    cout << "Please enter up to three ingredients... " << endl;

    for (int i = 0; i < 4; i++)
    {
        x.push_back("  ");
        getline(cin, x[i]);
        if (x[i] == "1")
        {
            break;
        }
    }

    return x;
}

2 个答案:

答案 0 :(得分:1)

替换

vector<string> ingredientvector(vector<string> x)

通过

void ingredientvector(vector<string>& x)

请勿在{{1​​}}结束时返回x。通过引用(ingredientvector)传递,对象可以直接由函数修改。

注意:如果您执行了以下操作,您的代码可能有效:

&

否则,ingreds = ingredientvector(ingreds); 中的本地x变量已填充,但对ingredientvector没有影响,因为它是通过副本传递的(ingredsx的本地副本1 {} ingreds内。 ingredientvector仅在ingreds返回x然后受ingredientvector影响后才会受到影响。

但是通过引用传递变量绝对是正确的方法。

答案 1 :(得分:0)

返回值时,默认情况下按值返回:

std::vector<string> ingredientvector()
{
  std::cout << "SEARCH BY INGREDIENT" << std::endl;
  std::cout << "Please enter up to three ingredients... " << std::endl;
  std::vector<string> x;
  x.reserve(4); 
  for (int i = 0; i < 4; i++)
  {
    x.push_back("  ");
    getline(cin, x[i]);
    if (x[i] == "1")
    {
        break;
    }
  }  
  return x;
}

像这样使用:

if (y == 1)
{
    const auto ingreds=ingredientvector();
    for (const auto& this_ingred : ingreds)
    {
        std::cout << this_ingred << " ";
    }
}