多维容器按列组合元素

4 篇文章 0 订阅
<pre name="code" class="cpp">// alg2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//昨天碰到一个文件,有这么一个std::vector<std::vector<std::string>> 
//现在需要将每一列的数据进行组合
//按照普通写法,每个vector的长度是知道的直接
//for(int lvl1;.....)
// for(int lvl2;...)
//	for(int lvl3,...)
//但问题是第一层的长度是变长,所以无法按照vector写出。
//木有办法啊,代码还是要写,还是要将结果组合出来
//通过递归来完成操作。
//made by davidsu33 2014-6-25
#include <boost/config/warning_disable.hpp>
#include <vector>
#include <string>
#include <iostream>
#include <assert.h>


//解法1,递归
void get_combine(std::vector<std::vector<std::string>>& src, 
	std::vector<std::string>& result, std::vector<int> & index)
{
	assert(index.size() == src.size());
	std::string aline;
	for (int i=0; i<index.size(); ++i)
	{
		aline += src[i][index[i]];
		if (i != index.size()-1)
		{
			aline += "-";
		}
	}

	result.push_back(aline);

	//索引进行转动移位
	++index[index.size()-1];
	//const int lastColSize = src[index.size()-1].size();

	for (int i=index.size()-1; i>=0; --i)
	{
		if (0 == index[i] % src[i].size())
		{
			if (i == 0)
			{
				return; //达到上限,无法移动
			}

			index[i] = 0;
			++index[i-1]; //进位
		}
		else
		{
			break; //继续处理
		}
	}

	get_combine(src, result, index);
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<std::string> v1, v2;
	v1.push_back("aa");
	v1.push_back("bb");
	v1.push_back("cc");
	v1.push_back("dd");

	v2.push_back("ee");
	v2.push_back("gg");
	v2.push_back("ff");
	v2.push_back("hh");

	std::vector<std::vector<std::string>> v;
	v.push_back(v1);
	v.push_back(v2);

	//std::vector<std::vector...中存的索引
	//类似密码表0001 0002,初始化为0000,然后
	//最低位达到该组的最大则上一位进一
	std::vector<int> index(v.size(), 0);
	std::vector<std::string> result;
	get_combine(v, result, index);

	//---组合结果输出-----
	for (int i=0; i<result.size(); ++i)
	{
		std::cout<<result[i]<<std::endl;
	}

	//解决方案2,while循环
	std::vector<std::string> result2;
	for (int i=0; i<index.size(); ++i)
	{
		index[i]  = 0;
	}
	
	bool bExit = false;
	//const int lastColSize = v[v.size()-1].size();
	while (true)
	{
		std::string aline;
		for (int i=0; i<index.size(); ++i)
		{
			aline += v[i][index[i]];
			if (i != index.size()-1)
			{
				aline += "-";
			}
		}
		result2.push_back(aline);

		++index[index.size()-1];
		for (int i=index.size()-1; i>=0; --i)
		{
			if (0 == index[i] % v[i].size())
			{
				if (i == 0)
				{
					bExit = true;
					break; //达到上限,无法移动
				}

				index[i] = 0;
				++index[i-1]; //进位
			}
			else
			{
				break; //继续处理
			}
		}

		if (bExit)
		{
			break;
		}
	}

	getchar();
	return 0;
}



                
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值