【问题标题】:How to shift elements to end of the array如何将元素移动到数组的末尾
【发布时间】:2020-12-13 23:12:38
【问题描述】:

我有这个数组:

std::string langs[] = { "C++", "Ada", "Haskell", "Python", "Ada" };

我想写一个函数来将 K 个元素移到末尾,例如:

k="Ada";

{ "C++", "Haskell", "Python", "Ada", "Ada" };

我写了这个,但它不起作用:

void moved(T e) 
{ 

    istd::vector<int> indexes;
        for (int i = 0; i < size_array; ++i)
        {
            if (array[i] == e)
            {
                indexes.push_back(i);
            }
        }
        
        for (int j = 0; j < (int)indexes.size(); ++j)
        {
            T temp=e;
            for (int i = indexes[j]; i < deleted_array_size-1; ++i)
            {
                array[i] = array[i + 1];
                std::cout << i << std::endl;
            }
            deleted_array_size--;
            array[deleted_array_size - 1] = temp;
            
        }
} 

如何移动元素?

【问题讨论】:

  • “它不工作”的信息远没有你想象的那么丰富。它是编译、链接、运行、崩溃,还是只是不做你期望的事情?它会改变一些元素而不是全部吗?请edit您的问题提供更多信息。
  • std::stable_partition(std::begin(langs), std::end(langs), [&amp;](const std::string&amp; elem) { return elem != k;} );
  • remove_if should do the job。并且完全搞砸了必须进行代码维护的人的大脑。
  • @user4581301 remove_if 可能会产生类似{ "C++", "Haskell", "Python", "", "Ada" } 的内容。它确实将未删除的元素向前移动,但它将已删除的元素移动到末尾;序列的尾部留下未指定的内容 - 例如未修改的原始值,或移出的对象。
  • 很高兴知道。我会缓冲的。

标签: c++ arrays shift


【解决方案1】:

如果顺序无关紧要,可以使用std::partition:

int main()
{
    std::string langs[] = { "C++", "Ada", "Haskell", "Python", "Ada" };
    std::partition(std::begin(langs), std::end(langs), [](auto& lang) {
        return lang != "Ada";
    });
 
    for (auto& str : langs) {
        std::cout << str << std::endl;
    }
}

打印:

C++
Python
Haskell
Ada
Ada

如果订购确实很重要,您可以使用std::stable_partition

【讨论】:

  • 它的工作谢谢:) 我如何使用 string langs* 的 begin 和 end
  • std::partition(langs, langs+n, ... 其中n 是元素的数量。见this Q&A
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
相关资源
最近更新 更多