Reputation: 66
//simply print each elements in a vector
template<class Iterp>
void print_iter(Iterp begin, Iterp end, std::string delim=", ", std::string ending="\n"){
int len = (end-begin);
for (size_t i = 0; i < len-1; i++)
{
std::cout << (*(begin+i)) << delim;
}
if (len>1){
std::cout << (*(end-1));
}
std::cout << ending;
}
template<class A, class B>
void pr(A first, A end, std::vector<std::vector<B>> &the_result){
int len = end-first;
for (size_t a = 0; a < len; a++)
{
for (size_t b = 0; b < len; b++)
{
for (size_t c = 0; c < len; c++)
{
//theres a bunch ways i tried to save these in "the_result" variable, and I ended up with this.
std::vector<B> result(first, end);
result.at(a) = (*(first+a));
result.at(b) = (*(first+b));
result.at(c) = (*(first+c));
print_iter(result.begin(), result.end());
//the problem is the "result" variable is not updating using .at() function. So the "result" variable content is still 1, 2, 3.
the_result.push_back(result); //this is not the problem since the "result" variable is still 1, 2, 3
// std::cout << (*(first+a)) << " " << (*(first+b)) << " " << (*(first+c))
// But, this one shows it's producing the right permutations.
}
}
}
}
int main(){
std::vector<int> test{1, 2, 3}; //tried to create the permutations of this
int n = 27; //3^3 = 27
std::vector<std::vector<int>> result(n, std::vector<int>(test.begin(), test.end()));
/*hoping to save all the permutations in "result" variable, each as a vector. ex:
123
113
111
...
*/
pr(test.begin(), test.end(), result);
}
So I tried to create a function to produce permutation with repeated elements and hoping to save each permutation in a 2-dimensional vector. However, I even cannot update the "result" variable vector using .at() function, pointer element. but when I print it manually, it's showing it's the right answer.
I also explored some other StackOverflow with similar problems, no answer works for me. vector element not updating
Dereference vector pointer to access element //tried to use pointer but still doesn't work
Where I made the mistake?
Upvotes: 0
Views: 418
Reputation: 122458
Your logic is flawed:
result.at(a) = (*(first+a));
result.at(b) = (*(first+b));
result.at(c) = (*(first+c));
No matter what are the values of a
,b
and c
, you assign the same numbers to the same elements in each iteraton. They are the same elements you used to initialize result
.
For 3
elements you rather need something along the line of:
result[1] = (*(first+a));
result[2] = (*(first+b));
result[3] = (*(first+c));
Upvotes: 2