打印两个向量以在彼此相邻的列中进行筛选?

时间:2015-12-17 04:23:45

标签: c++ vector

所以,我的程序使用while循环来填充两个单独的向量,方法是询问项目的名称(向量一),然后询问项目的价格(向量二)。

    double ItemCost;
    vector<double> Cost;
    string ItemName;
    vector<string> Item;

        while (ItemName != "done")
        {

            cout << "Item name: "; cin >> ItemName;
            Item.push_back(ItemName);// gets item name from use and stores in the vector "Item"
            if (ItemName != "done") 
            {
                cout << "Item cost: $"; cin >> ItemCost;
                Cost.push_back(ItemCost);// gets cost of item and stores it in the vector "cost"
            }
            else
            {
                continue;
            }
    }
system("CLS");

所以在清晰屏幕之后,我希望程序输出一个显示项目名称的屏幕,然后向右输出它的成本。然后在下一行第二项输入相同的事情。基本上这样会显示:

cout << Item[0]; cout << "         $" << Cost[0];
cout << Item[1]; cout << "         $" << Cost[1] << endl;
cout << Item[2]; cout << "         $" << Cost[2] << endl;

但是,无论输入了多少项,我都希望它能够做到这一点,如果他们输入的数量少于我在代码中的数量,那么按照我上面的方式做这显然是一个坏主意,因为程序会尝试到达外面的向量占用内存等。这仅仅是为了举例说明我想要的格式。

3 个答案:

答案 0 :(得分:2)

如果向量大小相同,则可以使用简单的for循环遍历内容:

for (int i = 0; i < Item.size(); ++i) {
    cout << Item[i] << " $" << Cost[i] << endl;
}

在运行此代码之前,您可能希望使用调试断言检查两个向量具有相同的大小:

assert(Item.size() == Cost.size();

或者,您可以使用类似std::min之类的东西来循环两个向量中最小的向量,以防它们的大小不同。

答案 1 :(得分:1)

我建议使用std::vector std::pair将价格和商品存储在一起,这仅仅是因为它可以跟踪哪个价格与哪个商品相关联。这样就不需要检查两个向量是否大小相同,并最大限度地减少发生错误的可能性。然后,使用基于范围的循环迭代每对并打印它们是一件简单的事情。我在下面展示了一些示例,并进行了一些改进。使用std::pair优于简单结构有许多优点,其中一个优点就是包含必要的布尔函数,以便在std::sort()之类的内容中使用。如果使用它将基本上对项目列表进行排序按字母顺序排列。如果您希望将来证明您的代码,这非常有用。

double ItemCost;
string ItemName;
vector<std::pair<string, double> > Item;

    while (ItemName != "done")
    {
        cout << "Item name: "; 
        // Using std::getline() as it terminates the string at a newline.
        std::getline(std::cin, ItemName);

        if (ItemName != "done") 
        {
            cout << "Item cost: $"; cin >> ItemCost;
            Item.push_back(std::make_pair (ItemName,ItemCost));
        }
        else
        {
            continue;
        }
    }

system("CLS");

// Printing here using c++11 range based for loop, I use this extensively
// as it greatly simplifies the code.

for (auto const &i : Item)
{ 
    std::cout << i.first << "\t\t$" <<  i.second;
                         //  ^^ Using double tab for better alignment
                         //     instead of spaces.
}

答案 2 :(得分:0)

Vector知道它有多大,所以有一堆简单的解决方案,最容易的

for (size_t index = 0; index < Item.size() && index < Cost.size(); index++)
{
    cout << Item[index]; cout << "         $" << Cost[index] << endl;
}

但更好的想法是让一个vector存储类似

的内容
struct ItemCost
{
    string name;
    double cost; // but it's generally safer to store money by pennies in integers
                 // You can't always count on floating point numbers in comparisons
}

这样,物品和成本永远不会失去同步。

请阅读此处了解更多有关为什么浮动点无法获得金钱等精确内容的信息:How dangerous is it to compare floating point values?