словарь — Поиск подходящего контейнера / функций для перечисления в переполнении стека

Я пытаюсь преобразовать некоторый код из c # в c ++, но отсутствие словарных таблиц / перечислимых данных и т. Д. Затрудняет получение результата, необходимого для c ++. Может кто-нибудь помочь с типом контейнера / методов для использования в C ++, чтобы получить необходимый результат?

Заранее спасибо.

Найти все c1 и его счетную группу по c1, где c2> 0 и c3 < 4 заказ по с1

table(c1,c2,c3)  ( number of rows expected is not finite - so - can't use Array as a structure for this )
5 1 2
4 2 3  --> edited this line to make it into the list
4 4 3
4 0 1  --> ignore this row as c2=0
3 1 3
2 1 5  --> ignore this row as c3 > 4
.....

…..

expected output(number of rows meeting criteria for each c1):
3 1
4 2
5 1

0

Решение

Вам понадобится как минимум:

  • struct держать каждый кортеж c1 / c2 / c3 (или std::tuple если вы используете C ++ 11).
  • std::vector (контейнер, похожий на массив, но с динамическим размером) для хранения всех ваших кортежей.
  • std::map (отсортированный ассоциативный контейнер), чтобы действовать в качестве словаря для вычисления вашего вывода.

Я полагаю, что этого достаточно, чтобы начать работу, если у вас возникли конкретные проблемы при написании кода, не стесняйтесь задавать новые вопросы.


Редактировать в соответствии с вашими комментариями:

Вы не пропустите много, решение Эльвены почти что вам нужно, за исключением того, что в нем отсутствует векторный контейнер для хранения объектов. Это довольно просто:

#include <iostream>
#include <map>
#include <vector>
#include <tuple>

int main()
{
std::vector<std::tuple<int, int, int>> values;
while (you_have_more_data) {
int c1, c2, c3;
// somehow read c1, c2, c3 from cin/file/whatever
values.push_back(std::make_tuple(c1, c2, c3));
}

std::map<int, int> dict;
// iterate over the vector
for (auto i = values.begin(); i != values.end(); ++i) {
// *i (dereferencing the iterator) yields a std::tuple<int, int, int>
// use std::get to access the individual values in the tuple
// 0 => c1; 1 => c2; 2 => c3 (same order as in std::make_tuple)
if (std::get<1>(*i) > 0 && std::get<2>(*i) < 4)
dict[std::get<0>(*i)] += 1; // see std::map::operator[]
}

// iterate over the map and print its items
for (auto i = dict.begin(); i != dict.end(); ++i)
// *i (dereferencing the iterator) yields a std::pair<int, int>
// but writing (*i).first is cumbersome
// let's write i->first instead (this is the same, just a different notation)
std::cout << i->first << " " << i->second << std::endl;

return 0;
}
1

Другие решения

Нечто подобное должно делать, единственная используемая память — для c1 и число действительных c2 / c3 для этого c1:

#include <iostream>
#include <map>

using namespace std;

int main()
{
int a,b,c = 0;
map<int, int> n;
int i;

for( i = 0 ; i < 6 ; i ++ )
{
cout << "Enter three numbers separated by space" << endl;
cin >> a >> b >> c;
if( b > 0 &&  c < 4 )
n[a] += 1;
}

for( auto iter = n.begin(); iter != n.end() ; ++iter )
cout << iter->first << " " << iter->second << endl;

return 1;
}

дает

3 1
4 1
5 1

Обратите внимание, что ваш пример не подходит для c1 = 4, так как 4.2.4 не выполняется по правилу c3.

1

По вопросам рекламы [email protected]