我希望程序从文件中读取一些内容,但是仅当元素第一次出现时才将新元素添加到列表中。我的问题是我不知道如何检查。循环看起来像这样:
file >> someData >> someData2;
if(someData appeared for the 1st time)
{
add someData to list;
}
else
add someData2 to list2;
我知道如何执行循环内的所有操作,但是if
内的条件是有问题的,因为程序不记得以前读取的数据。
我的想法是:检查列表中的每个元素或使用一个临时选项卡,该标签将存储someData并在函数结束后消失。
答案 0 :(得分:0)
正如评论中指出的那样,STL方法将使用'std :: set';为了透彻,我将说明如何同时使用std :: set和如何使用纯C;
// initial 'list' setup
std::set<decltype(someData)> listA;
std::vector<decltype(someData2)> listB;
// filling in data
file >> someData >> someData2;
// Insert the data into the set
// if the value already exists, leave it alone and push an element into listB
if(!listA.insert(someData).second) listB.push_back(someData2);
// some dynamically allocated arrays
char * listA;
unsigned listAsize;
char * listB;
unsigned listBsize;
// data variables (chars, for simplicity)
char dataA;
char dataB;
// loop variable
unsigned i;
// read data
readMyData(&dataA, &dataB);
// insert conditionally into lists
for(i = 0; i < listAsize; ++i) {
if(list[i] == dataA) {
// insert dataB into list B
break;
}
}
if(i == listAsize) {
// insert dataA into listA
}
答案 1 :(得分:0)
使用Standard library containers。他们几乎为您完成所有工作。
#include <iostream>
#include <string>
#include <set>
#include <sstream>
#include <vector>
int main()
{
std::istringstream file("A B1 C D1 A B2 C D2"); // fake input file in memory
std::string someData; // assuming strings because they are easy
std::string someData2;
std::set<std::string> list1;
std::vector<std::string> list2;
while (file >> someData >> someData2) // read in inputs until end or failure
// note: Not handling failures
{
auto result = list1.insert(someData); // attempt to add to list1
if(! result.second) // if already in set
{
list2.push_back(someData2); // add to list2
}
}
// print contents of lists
for (const auto & out: list1)
{
std::cout << out << ' ';
}
std::cout << '\n';
for (const auto & out: list2)
{
std::cout << out << ' ';
}
}