如何使用回退方法的C ++向量

时间:2015-02-20 21:49:17

标签: c++ vector push-back

int numFiles;
cout << "How many signal files are there?";
cin >> numFiles;

vector<string> signalFiles(numFiles);
vector<string> backgroundFiles(numFiles);

string backgroundFile;

for (int i=0;i<numFiles;i++){

    string singalFiles;
    cout << "Please input the name of singal file" << i << ".";
    cin >> singalFiles[i];
    signalFiles.push_back(signalFiles());

    string backgroundFiles;
    cout << "Please input the name of background file" << i << ".";
    cin >> backgroundFiles[i];
    backgroundFiles.push_back(backgroundFiles.str());

}

我如何对给定的向量使用push_back方法?

我在代码中收到以下错误消息:

No member named 'str' in 'std::__1::basic_string<char>'

我很困惑为什么收到这条消息。

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

  1. 您正在预先分配每个size()的{​​{1}},这意味着您预先填充了空白值。然后你正在阅读那些现有元素(这很好),并且std::vector你已经存储的内容(这是错误的)。因此,要么停止预先分配push_back()(您可以使用size()方法预先分配reserve()),这样您就可以正确使用capacity(),或者使用向量push_back()运算符用于分配现有元素并完全删除[]

  2. 您的push_back()字符串变量与您的backgroundFiles向量变量(使用的名称相同)发生冲突。您需要重命名它们以使它们独一无二。

  3. backgroundFiles没有std::stringstr()个成员。您声明operator()容器包含std::vector个元素,而您从std::string读取的值已经是std::cin类型,因此只需按原样存储它们。

  4. 您一遍又一遍地使用std::string而不考虑换行符。 cin >>运算符在遇到空格时停止读取,而不是在遇到换行符时停止读取。您应该切换到>>

  5. 请改为尝试:

    std::getline()

    或者这个:

    int numFiles = 0;
    cout << "Please input the number of signal files:";
    if (!(cin >> numFiles)) {
        // error reading the number, do something
    }
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
    vector<string> signalFiles, backgroundFiles;
    signalFiles.reserve(numFiles);
    backgroundFiles.reserve(numFiles);
    
    for (int i = 0; i < numFiles; ++i) {
    
        string signalFile;
        cout << "Please input the name of signal file " << i+1 << ":";
        if (!getline(cin, signalFile)) {
            // error reading the string, do something
            break;
        }
        signalFiles.push_back(signalFile);
    
        string backgroundFile;
        cout << "Please input the name of background file " << i+1 << ":";
        if (!getline(cin, backgroundFile)) {
            // error reading the string, do something
            break;
        }
        backgroundFiles.push_back(backgroundFile);
    }
    

    我更喜欢第一种方法,因为向量int numFiles = 0; cout << "Please input the number of signal files:"; if (!(cin >> numFiles)) { // error reading the number, do something } cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); vector<string> signalFiles(numFiles); vector<string> backgroundFiles(numFiles); for (int i = 0; i < numFiles; ++i) { string signalFile; cout << "Please input the name of signal file " << i+1 << ":"; if (!getline(cin, signalFile)) { // error reading the string, do something break; } signalFiles[i] = signalFile; string backgroundFile; cout << "Please input the name of background file " << i+1 << ":"; if (!getline(cin, backgroundFile)) { // error reading the string, do something break; } backgroundFiles[i] = backgroundFile; } 将准确反映成功读取和推送的文件数量。使用第二种方法,如果发生错误,向量size()将包含未被覆盖的默认空白值。