#c #containers
#c #контейнеры
Вопрос:
Предположим, у меня есть
(A,B)
(A,C)
(A,D)
(B,C)
(B,D)
(C,D)
(D,E)
в текстовый файл. Я извлеку его с помощью регулярных выражений.
Я хотел бы вставить данные в контейнер так, чтобы это выглядело следующим образом.
A->B,C,D
B->C,D
C->D
D->E
Какой контейнер я использую?
Мне нужно иметь возможность искать данные как с левой, так и с правой стороны контейнера, т. Е. по ключу и значению. Итак, мне нужно иметь возможность поиска
A, B, C, D в
A->B,C,D
B->C,D
C->D
D->E
и B, C, D в
A->B,C,D
Мне нужно иметь возможность выполнять поиск и вставку как в ключах, так и в значениях для повторения, чтобы, если я получу a (C, E), я мог вставить его, чтобы иметь
C->D,E
Комментарии:
1. Просто используйте map<std::string,std::set> и вспомогательную map для обратного отображения.
2. Как это
(A,D)
вписывается в ваши ожидаемые данные?3. Как выбрать между set и map?
4. (A, D) изменил бы столбец, чтобы создать A-> B, C, D
5. Возможно, вам следует обновить свои вопросы, чтобы отразить это тогда, поскольку отображение ожидаемых данных как
A->B,C
довольно запутанно, учитывая ваш приведенный ввод.
Ответ №1:
A std::vector
с одноразовой сортировкой в конце вполне может быть более эффективным, чем что-то вроде std::set
(которое будет поддерживать порядок при вставке).
Моим советом было бы выбрать тот, который наилучшим образом соответствует семантике того, что вы хотите сделать, а затем изменить его позже, если вы обнаружите, что это неэффективно.
Комментарии:
1. @Chris: Если ваш новый вопрос действительно соответствует тому, о чем вы хотели, чтобы этот вопрос был, тогда, пожалуйста, просто отредактируйте этот вопрос и удалите новый! (или наоборот …)