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>'
我很困惑为什么收到这条消息。
答案 0 :(得分:2)
您的代码存在一些问题:
您正在预先分配每个size()
的{{1}},这意味着您预先填充了空白值。然后你正在阅读那些现有元素(这很好),并且std::vector
你已经存储的内容(这是错误的)。因此,要么停止预先分配push_back()
(您可以使用size()
方法预先分配reserve()
),这样您就可以正确使用capacity()
,或者使用向量push_back()
运算符用于分配现有元素并完全删除[]
。
您的push_back()
字符串变量与您的backgroundFiles
向量变量(使用的名称相同)发生冲突。您需要重命名它们以使它们独一无二。
backgroundFiles
没有std::string
或str()
个成员。您声明operator()
容器包含std::vector
个元素,而您从std::string
读取的值已经是std::cin
类型,因此只需按原样存储它们。
您一遍又一遍地使用std::string
而不考虑换行符。 cin >>
运算符在遇到空格时停止读取,而不是在遇到换行符时停止读取。您应该切换到>>
。
请改为尝试:
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()
将包含未被覆盖的默认空白值。