如何输出矢量?

时间:2016-09-27 16:31:58

标签: c++

我正在尝试创建一个程序,它将从用户获取字符串并将它们存储在向量中。将它们存储在矢量中后,可以将它们显示,删除或打印到文件中。我正在创建程序的一部分,显示向量中的元素,但我似乎无法让它工作。 这是我的WIP:

#include <iostream>
#include <cctype>
#include <ctype.h>
#include <algorithm>
#include <string>
#include <math.h>
#include <windows.h>
#include <iomanip>
#include <vector>
#include <ostream>
#include <sstream>
#include <fstream>
#include <istream>

// common namespace
using namespace std;

int main()
{
    start:int option;
    cout << "Welcome to MyBook! - A text recorder framework application." << endl;
    cout << "-----------------------------------------------------------" << endl;
    cout << "Main Menu:" << endl;
    cout << "1 - Add a book to the collection." << endl;
    cout << "2 - Display all books currently in the collection." << endl;
    cout << "3 - Remove a book from the collection." << endl;
    cout << "4 - Write stored date to file." << endl;
    cout << "5 - Quit" << endl;
    cout << "Make your selection: ";
    cin >> option;

    vector<string> bookCollection;
    string entryVal = " ";
    string anotherOption;

    **if (option == 1)
    {
        // add a book to the collection
        cin.ignore();
    enterbook:cout << "Add a book to the collection: "; 
        getline(cin, entryVal);
        bookCollection.push_back(entryVal);

        cout << "Would you like to enter another book?(1 - yes, 0 - no): "; 
        getline(cin, anotherOption);
        //cout << "test";

        if (anotherOption == "1")
        {
            goto enterbook;
        }

        else if (anotherOption == "0")
        {
            goto start;
        }

    }

    else if (option == 2)
    {
        for (int i = 0; i < bookCollection.size(); i++)
            cout << bookCollection[i] << " ";
    }**

    else if (option == 3)
    {
        // remove a book from the collection
    }

    else if (option == 4)
    {
        //write to file
    }

    else if (option == 5)
    {
        //Nested IF to kill program properly
        int quitVar;
        cout << "Are you sure you want to exit the program?: ";
        cin >> quitVar;

        if (quitVar == 1)
        {
            cout << "The program will now be terminated." << endl;
            return 0;
        }

        else if (quitVar == 0)
        {
            cout << "Returning to the main menu." << endl;
            goto start;
        }
    }
}

我的问题是:为什么我不打印bookCollection?或者更好的是,什么甚至存储在bookCollection中?

此外:有没有人有一些建议指出我正确的方向如何从我的矢量中删除元素,以及如何将我的矢量元素打印到文件?

2 个答案:

答案 0 :(得分:1)

鉴于vector<string> bookCollection,您可以使用ostream_iterator将其内容转储到文件中,例如&#34; foo.txt&#34;:

copy(cbegin(bookCollection), cend(bookCollection), ostream_iterator<string>(ofstream("foo.txt"), "\n"))

您可以使用remove删除元素,例如string entryVal

bookCollection.resize(bookCollection.size() - distance(remove(begin(bookCollection), end(bookCollection), entryVal), end(bookCollection));

答案 1 :(得分:1)

  

我的问题是:为什么我不打印bookCollection?或者更好的是,甚至存储在bookCollection中的是什么?

添加元素后,您正在跳转到start(用户按下0后),它位于main()的最顶部,它可能会导致您的矢量被清除并重新初始化。根据标准你的代码是正确的,但事实上你从收集在范围内的范围跳到不是c-tor和d-tor的地方:6.7 / 3(例如更令人讨厌):

  

可以转换为块,但不能以初始化绕过声明的方式。一个   程序从具有自动存储持续时间的变量不在范围内的点跳转到a   除非变量具有标量类型,具有普通默认值的类类型,否则它在范围内的点是不正确的   构造函数和一个普通的析构函数,这些类型之一的cv限定版本,或其中一个的数组   在没有初始值设定项的情况下声明前面的类型(8.5)。

[ Example:
void f() {
// ...
goto lx; // ill-formed: jump into scope of a
// ...
ly:
X a = 1;
// ...
lx:
goto ly; // OK, jump implies destructor
// call for a followed by construction
// again immediately following label ly
}
—end example ]

一旦您将start:移到bookCollection声明之下,您可能会在收藏中看到一些内容。但是 - 我强烈建议用普通的旧goto循环替换while