【问题标题】:How to insert a vector into another vector in a specific place so that i will get a big vector of both and that place will be overwritten?如何将向量插入到特定位置的另一个向量中,以便我将获得两者的大向量并且该位置将被覆盖?
【发布时间】:2020-04-17 10:54:30
【问题描述】:

对于一个练习,我真的需要知道如何将一个向量插入另一个向量。

这是我需要的示例:

//let's say i have these 2 vecs: 
vec1 = { 18, 192, 34};
vec2 = { 171, 11, 50, 6};

我选择连接它们的点,假设我选择 vec 1 像这样代替向量 2 的 2:

result_vec = { 171, vec1, 50, 6};

所以当我完成后我实际得到的是:

result_vec = { 171, 18, 192, 34, 50, 6};

对我来说,最好看两个示例,一个简单示例,另一个示例带有智能指针,如 shared_ptr 或 unique_ptr。

谢谢!

【问题讨论】:

  • 我认为 shared_prt 和 unique_ptr 与您的问题无关,可以删除标签。如果你对使用智能指针的代码有问题,你应该展示它

标签: c++ vector visual-studio-2019 shared-ptr unique-ptr


【解决方案1】:

有时浏览一些参考资料并查看容器提供的方法会有所帮助。大多数时候,您会发现有一种方法可以开箱即用。在这种情况下,它是std::vector::insert(重载(4))。要删除该位置的旧元素,您可以使用std::vector::erase:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec1{ 18, 192, 34};
    std::vector<int> vec2{ 171, 11, 50, 6};
    vec1.insert(vec1.begin()+1,vec2.begin(),vec2.end());
    vec1.erase(vec1.begin()+1);
    for (int e : vec1) std::cout << e << ' ';
}

输出:

18 11 50 6 192 34 

我以相反的方式插入,但它应该很容易调整。同样对智能指针执行相同操作也不需要使用不同的算法/方法。如果要保留原始向量,只需在插入前进行复制即可。

PS:我首先误读了问题,错过了在您插入的地方删除元素的部分。我的固定解决方案不是最有效的,因为插入和擦除旧元素可以一次性完成。但是,对于不太大的向量,效率上的差异可能可以忽略不计。

【讨论】:

  • 是的,但它是否适用于唯一和共享 ptr 等智能指针?
【解决方案2】:

您似乎想用一个向量的一个元素替换另一个向量的元素。如果是这样,那么您可以编写一个类似于演示程序中所示的函数。

#include <iostream>
#include <vector>
#include <iterator>

template <typename T>
std::vector<T> & replace( std::vector<T> &v1, 
                          typename std::vector<T>::size_type pos,
                          const std::vector<T> &v2 )
{
    if ( not ( pos < v1.size() ) )
    {
        v1.insert( std::end( v1 ), std::begin( v2 ), std::end( v2 ) );
    }
    else
    {
        v1.insert( v1.erase( std::next( v1.begin(), pos ) ),
                   std::begin( v2 ), std::end( v2 ) );
    }

    return v1;
}                          

int main() 
{
    std::vector<int> v1 = { 171, 11, 50, 6 };
    std::vector<int> v2 = { 18, 192, 34 };

    for ( const auto &item : replace( v1, 1, v2 ) ) std::cout << item << ' ';
    std::cout << '\n';

    return 0;
}

程序输出是

171 18 192 34 50 6 

【讨论】:

  • 好像我误读了这个问题,+1 比我更专心;)
  • 谢谢你们!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2017-12-05
  • 2014-02-24
  • 2021-07-24
  • 2011-10-19
  • 1970-01-01
相关资源
最近更新 更多