多维容器按列组合元素

// 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] % lastColSize)
		{
			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] % lastColSize)
			{
				if (i == 0)
				{
					bExit = true;
					break; //达到上限,无法移动
				}

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

		if (bExit)
		{
			break;
		}
	}

	getchar();
	return 0;
}

多维容器按列组合元素,布布扣,bubuko.com

时间: 2024-12-29 23:58:34

多维容器按列组合元素的相关文章

c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。

将一个二维数组行和列的元素互换,存到另一个二维数组中. 解:程序: #include<stdio.h> int main() { int i, j, a[2][3] = { {1,2,3},{4,5,6} },b[3][2]; printf("array a:\n"); for (i = 0; i <=1; i++)//处理a数组中的一行中各元素 { for (j = 0; j <= 2; j++)//处理a数组中的某一列元素 { printf("%5

将一个二维数组的行和列的元素互换,存到另一个二维数组中。

#include<stdio.h> int main() { int a[][3]={{1,2,3},{4,5,6},{6,9,7}};     int b[3][3],i,j;       printf("array a:\n");   for(i=0;i<=2;i++)       //处理数组中的一行中的各元素   {      for(j=0;j<=2;j++)     //处理a中的某一列的元素   {    printf("%5d"

二维数组的列排序

给出一个二维数组,请将这个二维数组按第i列(i从1开始)排序,如果第i列相同,则对相同的行按第i+1列的元素排序,如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列.如果第i列到最后一列都相同,则按原序排列. 实现以下接口: 输入一个m*n 的整数数组,实现按规则排列,返回排列后的数组. 调用者会保证: 比如输入数组为: 1,2,3 2,3,4 2,3,1 1,3,1 按第二列排序: 输出: 1,2,3 2,3,1 1,3,1 2,3,4 分析:从最后一列开始使用稳定的排序

往一个容器 添加删除子元素演示,和,给数 组添加自定义方法

/*2015 12 2 往一个容器 添加删除子元素演示*/ //全局静态变量的写法 (function(){ //获取元素对象 var container = document.getElementById("container"); var btnAdd = document.getElementById("btnAdd"); var btnDel = document.getElementById("btnDel"); //定义数组 var

numpy广播机制,取特定行、特定列的元素 的高级索引取法

numpy广播机制,取特定行.特定列的元素 的高级索引取法 enter description here enter description here 原文地址:https://www.cnblogs.com/lishikai/p/12361513.html

js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合

现在有一批手机,其中颜色有['白色','黑色','金色','粉红色']:内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[['白色','16G','移动'], ['白色','16G','联通'] ...]这样的组合,扩张,如果后面还有参数,比如再加一个['国行','港版','美版'],不改程序一样可以执行! 通过上面规律可以发现这个算法就是:一个数组里面包含若干个数组,进行组合 算法代码写法一: // 执行组合排列的函数

PHP之提取多维数组指定列的方法

前言:有时候在开发中会遇到这样的问题,我们需要把有规律的多维数组按照纵向(列)取出,有下面的方法可用: 我们将拿下面的数组来处理: 1 $arr = array( 2 '0' => array('id' => 1, 'name' => 'name1'), 3 '1' => array('id' => 2, 'name' => 'name2'), 4 '2' => array('id' => 3, 'name' => 'name3'), 5 '3' =&

二维数组(矩阵)元素查找

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思考 二分查找 a1 a2 a3 a4 a5 a6 b1 → → → → → c1 ↓ d1 ↓ e1 ↓ f1 ↓ 总结 题目的理解错了,错误的认为,矩阵满足这样的规律: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 其实这只是一个特例,题目只说举证中的元素满足

STL容器遍历时删除元素

STL容器遍历时在循环体内删除元素最容易出错了,根本原因都是因为迭代器有效性问题,在此记下通用删除方法,该方法适用于所有容器: 1 std::vector<int> myvec; 2 3 std::vector<int>::iterator it = myvec.begin(); 4 while( it != myvec.end()) 5 { 6 it = myvec.erase(it); 7 } 容器list有个比较另类的删除方法,如下代码所示: std::list<int