Я чаще всего использую его, когда я должен повредить чей-либо (обычно платформа) инкапсуляция. Таким образом, я должен изменить некоторое частное поле, или назвать закрытый метод или создать экземпляр некоторого внутреннего класса в библиотеке, которую я не имею никакого права изменять. Хорошим примером является код в мой ответ к этот вопрос . В этом случае поведение метода платформы ServiceBase.Run
было недопустимо, таким образом, я использовал отражение, чтобы сделать то же самое, это делает более приемлемым способом.
Отражение имеет много другого использования, тем не менее, включая утка, вводящая , работающая с атрибуты , и позднее связывание .
Что ж, если вам не нужно решение, я бы реализовал его так:
Используйте вектор V с каждым элементом, взятым из строки. Например, если это 23, то ваш вектор V будет иметь два вектора, каждый из которых содержит 2ABC и 3DEF.
Итерируйте каждую цифру, как счетчик, по соответствующей строке. Двигайтесь справа налево, и когда каждая цифра переполняется, увеличивайте единицу влево, сбрасывайте и т. Д.
Отображайте счетчик на каждой итерации, чтобы получить свое «число».
Подсказка по компиляции ошибок:
в STL. это должно быть
getLetters
. multimap
lmap
передано по постоянной ссылке. Следовательно, API equal_range
на lmap
вернет пару const_iterator
, а не только итератор
. Как насчет следующего:
#include <cstddef>
#include <iostream>
#include <iterator>
#include <string>
#include <algorithm>
template <typename Iterator>
bool next_combination(const Iterator first, Iterator k, const Iterator last);
int main()
{
std::string phone_number = "23";
std::string number[] = {
"0", "1", "2abc", "3def", "4ghi",
"5jkl","6mno", "7pqrs", "8tuv","9wxyz"
};
std::string tmp_set;
std::string set;
for(std::size_t i = 0; i < phone_number.size(); ++i)
{
tmp_set += number[static_cast<std::size_t>(phone_number[i] - '0')];
}
std::sort(tmp_set.begin(),tmp_set.end());
std::unique_copy(tmp_set.begin(),
tmp_set.end(),
std::back_inserter(set));
std::string current_set;
current_set.reserve(phone_number.size());
do
{
std::copy(set.begin(),
set.begin() + phone_number.size(),
std::back_inserter(current_set));
do
{
std::cout << current_set << std::endl;
}
while (std::next_permutation(current_set.begin(),current_set.end()));
current_set.clear();
}
while(next_combination(set.begin(),
set.begin() + phone_number.size(),
set.end()));
return 0;
}
template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Thomas Draper */
if ((first == last) || (first == k) || (last == k))
return false;
Iterator itr1 = first;
Iterator itr2 = last;
++itr1;
if (last == itr1)
return false;
itr1 = last;
--itr1;
itr1 = k;
--itr2;
while (first != itr1)
{
if (*--itr1 < *itr2)
{
Iterator j = k;
while (!(*itr1 < *j)) ++j;
std::iter_swap(itr1,j);
++itr1;
++j;
itr2 = k;
std::rotate(itr1,j,last);
while (last != j)
{
++j;
++itr2;
}
std::rotate(k,itr2,last);
return true;
}
}
std::rotate(first,k,last);
return false;
}