我有這個代碼,我想在我的向量中找到一個詞并洗掉包含該詞的專案,但是,我的代碼將從第一行洗掉,直到我想要的專案,我該如何解決?
std::string s;
std::vector<std::string> lines;
while (std::getline(theFile, s))
{
lines.push_back(s);
}
//finding item in vector and changing it
for (unsigned i = 0; i < lines.size(); i )
{
std::size_t found = lines[i].find(name);
if (found != std::string::npos)
{
lines.erase(lines.begin() i);
}
}
更新 1:
這是我的完整代碼:我正在打開一個檔案,其中包含這種格式的一些元素(大衛,2002 年,1041 年,1957 年)(克萊夫,2003 年,1071 年,1517 年)(阿里,2005 年,1021 年,1937 年)我得到用戶輸入并找到包含它的行。然后我想完全洗掉那條線,所以我將它匯入到一個向量中,然后我無法修改它
#include <iostream>
#include <string>
#include <vector>
#include <stream>
#include <algorithm>
using namespace std;
using std::vector;
int main(){
string srch;
string line;
fstream Myfile;
string name;
int counter;
Myfile.open("Patientlist.txt", ios::in | ios::out);
cout <<"Deleting your Account";
cout << "\nEnter your ID: ";
cin.ignore();
getline(cin, srch);
if (Myfile.is_open())
{
while (getline(Myfile, line))
{
if (line.find(srch) != string::npos)
{
cout << "\nYour details are: \n"
<< line << endl;
}
break;
}
}
else
{
cout << "\nSearch Failed... Patient not found!" << endl;
}
Myfile.close();
ifstream theFile("Patientlist.txt");
//using vectors to store value of file
std::string s;
std::vector<std::string> lines;
while (std::getline(theFile, s))
{
lines.push_back(s);
}
//finding item in vector and changing it
for (unsigned i = 0; i < lines.size(); i )
{
std::size_t found = lines[i].find(name);
if (found != std::string::npos)
{
lines.erase(lines.begin() i);
}
}
//writing new vector on file
ofstream file;
file.open("Patientlist.txt");
for (int i = 0; i < lines.size(); i)
{
file << lines[i] << endl;
}
file.close();
cout << "Done!";
}
uj5u.com熱心網友回復:
擦除回圈壞了。正確的方法是使用迭代器,并使用回傳的迭代器erase。像這樣:
// finding item in vector and changing it
for (auto it = lines.begin(); it != lines.end();) {
if (it->find(name) != std::string::npos) {
it = lines.erase(it);
} else {
it;
}
}
或者使用擦除-洗掉習語:
lines.erase(std::remove_if(lines.begin(), lines.end(),
[&name](const std::string& line) {
return line.find(name) != std::string::npos;
}), lines.end());
或者從 C 20 開始std::erase_if(std::vector):
std::erase_if(lines, [&name](const std::string& line) {
return line.find(name) != std::string::npos;
});
uj5u.com熱心網友回復:
您可以remove_if為此使用。謂詞引數應該檢查您是否可以在一行中找到一個單詞。然后記得使用erase將向量“收縮”到新的大小。
[演示]
#include <algorithm> // remove_if
#include <iostream> // cout
#include <string>
#include <vector>
int main()
{
std::vector<std::string> lines{"one two three", "three four five", "five six one"};
lines.erase(
std::remove_if(std::begin(lines), std::end(lines), [](auto& line) {
return line.find("one") != std::string::npos;}),
std::end(lines)
);
for (auto& line : lines) { std::cout << line << "\n"; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/393811.html
