Вы делаете это немного более сложным, чем это должно быть. Давайте запустимся с конца Вашего примера:
String parameterString = "";
if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," );
if ( anotherCondition ) parameterString = appendWithDelimiter( parameterString, "anotherElementName", "," );
С небольшим изменением использования StringBuilder вместо Строки, это становится:
StringBuilder parameterString = new StringBuilder();
if (condition) parameterString.append("elementName").append(",");
if (anotherCondition) parameterString.append("anotherElementName").append(",");
...
, Когда Вы сделаны (я принимаю, необходимо проверить несколько других условий также), просто удостоверьтесь, что Вы удаляете запятую конца с командой как это:
if (parameterString.length() > 0)
parameterString.deleteCharAt(parameterString.length() - 1);
И наконец, получите строку, которую Вы хотите с
parameterString.toString();
, Вы могли также заменить"", во втором вызове для добавления с универсальной строкой разделителя, которая может быть установлена на что-либо. Если у Вас есть список вещей, Вы знаете, что необходимо добавить (неусловно), Вы могли поместить этот код в методе, который берет список строк.
Словарь будет std :: map в C ++, а кортеж с двумя элементами будет std :: pair.
Предоставленный код Python будет преобразован в:
#include <iostream>
#include <map>
typedef std::map<std::pair<int, int>, int> Dict;
typedef Dict::const_iterator It;
int main()
{
Dict d;
d[std::make_pair(0, 0)] = 0;
d[std::make_pair(1, 2)] = 1;
d[std::make_pair(2, 1)] = 2;
d[std::make_pair(2, 3)] = 3;
d[std::make_pair(3, 2)] = 4;
for (It it(d.begin()); it != d.end(); ++it)
{
int i(it->first.first);
int j(it->first.second);
std::cout <<it->second <<' '
<<d[std::make_pair(j, i)] <<'\n';
}
}
Тип
std::map< std::pair<int,int>, int>
Код для добавления записей в карту выглядит следующим образом:
typedef std::map< std::pair<int,int>, int> container;
container m;
m[ make_pair(1,2) ] = 3; //...
for(container::iterator i = m.begin(); i != m.end(); ++i){
std::cout << i.second << ' ';
// not really sure how to translate [i,j] [j,i] idiom here easily
}
Взгляните на Boost.python . Это' s для взаимодействия между Python и C ++ (в основном создание библиотек Python с использованием C ++, но также для встраивания Python в программы на C ++). Описано большинство структур данных питонов и их эквиваленты на C ++ (не проверены на тот, который вам нужен).
std :: map
или более вероятно std :: tr1 :: unordered_map
/ boost :: unordered_map
(также известный как hash_map
) это то, что вам нужно.
Кроме того, как сказал Крисс, Boost.Python - хорошая идея, чтобы посмотреть здесь. Он уже предоставляет версию класса dict python для C ++, поэтому, если вы делаете кросс-языковой материал, это может быть полезно.
Вы хотите вызвать оптимизированную подпрограмму C ++ через Python? Если да, читайте дальше:
Часто я использую PyYaml при работе со словарями в Python. Возможно, вы могли бы связать что-то вроде LibYAML или yamlcpp , чтобы:
std :: map
Предупреждение: я никогда не пробовал это, но использование всеми любимой поисковой системы на "yaml std :: map" дает много интересных ссылок
Как прямой ответ на ваш вопрос (для части Python посмотрите мой другой ответ). Вы можете забыть о кортеже, если хотите. Вы можете использовать ключ / значение любого типа сопоставления (хэш и т. Д.) В C ++, вам просто нужно найти уникальную ключевую функцию. В некоторых случаях это может быть легко. Например, если у вас два целых числа - это целые числа от 1 до 65536, вы просто можете использовать 32-битное целое число с каждой 16-битной частью первого ключа. Простой сдвиг и «или» или + для объединения двух значений помогут, и это очень эффективно.