Как удалить аналогичные значения и сгруппировать его из текстового файла в C ++? - PullRequest
1 голос
/ 15 марта 2020

Скажем, у меня есть текстовый файл

200     34

34     377

20      2

34     45

200    7

10     63

, и я хочу сгруппировать его так, чтобы значения первого столбца не повторялись и содержали элементы столбца 2, например:

200:  34  7


34 :  377 45


20:   2


10:   63

Как мне это сделать? Я начинающий программист, и до сих пор мне удалось только прочитать файл и распечатать его, используя

ifstream inFile;

inFile.open("textfile.txt");

if (inFile.fail()) {
    cerr << "Error opeing a file" << endl;
    inFile.close();
    exit(1);
}
string line;

while (getline(inFile, line))
{
    cout << line << endl;
}

inFile.close();

1 Ответ

1 голос
/ 15 марта 2020

Считать ввод в мультикарту и затем выполнить итерацию по введенным элементам.

std::multimap<int, int> m;
int a, b;
while (inFile >> a >> b) {
    m.insert(std::make_pair(a, b));
}
inFile.close();


for (auto it = m.begin(); it != m.end(); ) {
    std::cout << it->first << ": ";
    for (auto end = m.upper_bound(it->first); it != end; it++) {
        std::cout << it->second << " ";
    }
    std::cout << "\n";
}

Но, может быть, проще подумать о карте с вектором:

std::map<int, std::vector<int>> m;
int a, b;
while (inFile >> a >> b) {
    m[a].push_back(b);
}
inFile.close();

for (auto i : m) {
    std::cout << i.first << ": ";
    for (auto j : i.second) {
        std::cout << j << " ";
    }
    std::cout << "\n";
}

Проверено на godbolt .

Кажется, что ваш вывод имеет ключи в обратном порядке, поэтому вы можете использовать rbegin и rend с обратными итераторами для итерации по карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...