【问题标题】:rearrange int vector c++ function重新排列 int 向量 c++ 函数
【发布时间】:2023-03-30 21:22:01
【问题描述】:

您好,我有以下 std::vector:

std::vector<int> source ={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

我想对其进行洗牌,以便对于给定的数字,例如 n = 4 是这样的输出向量:

std::vector<int> output = {3,2,1,0,7,6,5,4,11,10,8,9,15,14,13,12}

任何想法应该如何功能?

【问题讨论】:

  • 对我来说它看起来不像是洗牌。您想在n 组中反转您的元素吗?标准算法适用于“范围”,而不是容器,因此使用您现有的算法技术应该很容易组合。玩std::reverse 和整数算术运算,然后向我们展示你的想法。
  • 除非有人“聪明”回答这个问题。
  • @mthe25 你是怎么得到 11,10,8,9 的?:)
  • @LightnessRacesinOrbit:您的意思是“迭代器上的算术运算”而不是“整数上的算术运算”吗?
  • @ChristianHackl:哈,是的,我做到了:)

标签: c++ function vector


【解决方案1】:

正如Lightness Races in Orbit 在 cmets 中所说,只需稍加努力即可使用标准算法函数完成。

using vector_size_t = std::vector<int>::size_type;

std::vector<int> source = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
std::vector<int> result = source;

vector_size_t source_size = source.size();
vector_size_t group_size = 4;

for(vector_size_t i = 0; i < source_size / group_size; ++i)
{
    std::reverse
    (
        std::next(std::begin(result), i * group_size),
        std::next(std::begin(result), std::min((i + 1) * group_size, source_size))
    );
}

【讨论】:

  • 在几个地方没有使用正确的类型,但对于给定的输入数据,这已经足够了
  • 为什么是(std::min) 而不仅仅是std::min
  • 使用size_t i 可能比unsigned i 更好。
  • @Muscampester 我在 VS 中包含了window.h,而std::min 与我的源代码中的min 宏发生冲突。我忘了纠正它。是的,最好使用size_t。我正在编辑。
  • 啊,好吧,我在一些库中看到了圆括号,它们可以消除歧义,但我也可以看到,如果涉及宏,通常可能需要这样做。 ::size_type 可能比 size_t 更好。直到。 :)
猜你喜欢
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多