在c+中考虑重复的情况下连接多个std::向量+;17 虽然在C++中直接连接两个代码> STD::向量,特别是在范围内,但我有一个稍微不同的问题。

在c+中考虑重复的情况下连接多个std::向量+;17 虽然在C++中直接连接两个代码> STD::向量,特别是在范围内,但我有一个稍微不同的问题。,c++,vector,concatenation,C++,Vector,Concatenation,假设我有以下向量:{1,2,6},{6,8,9},{9,8,10},等等。如果一个向量的尾部与要连接到的下一个向量的头部相同,我只希望最后一个向量中有一个元素,如下所示: conc({1,2,6},{6,8,9},{9,8,10},{0,1})={1,2,6,8,9,8,10,0,1} 我可以使用if条件来实现这一点,但我认为这并不是很有效,因为我必须做数十万次,最好是使用STL,而不使用外部库 如果有帮助的话,总是只有4个向量需要连接 #include <vector> #incl

假设我有以下向量:
{1,2,6}
{6,8,9}
{9,8,10}
,等等。如果一个向量的尾部与要连接到的下一个向量的头部相同,我只希望最后一个向量中有一个元素,如下所示:

conc({1,2,6},{6,8,9},{9,8,10},{0,1})={1,2,6,8,9,8,10,0,1}

我可以使用
if
条件来实现这一点,但我认为这并不是很有效,因为我必须做数十万次,最好是使用STL,而不使用外部库

如果有帮助的话,总是只有4个向量需要连接

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> v1{1,2,6};
    std::vector<int> v2{6,8,9};
    std::vector<int> v3{9,8,10};
    std::vector<int> v4{0, 1};

    std::vector<int>V{v1};
     
    

    if (v1.back() == v2.front())
    {
        for(auto it= v2.begin()+1; it != v2.end(); ++it)
        {
            V.push_back(*it);
        }
    }
    else
    {
         for(auto it= v2.begin(); it != v2.end(); ++it)
        {
            V.push_back(*it);
        }
    }

    //repeat the above prcess for other vectors
    
}
编辑:要连接的向量的末尾和开头可能有相同的元素,也可能没有相同的元素

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> v1{1,2,6};
    std::vector<int> v2{6,8,9};
    std::vector<int> v3{9,8,10};
    std::vector<int> v4{0, 1};

    std::vector<int>V{v1};
     
    

    if (v1.back() == v2.front())
    {
        for(auto it= v2.begin()+1; it != v2.end(); ++it)
        {
            V.push_back(*it);
        }
    }
    else
    {
         for(auto it= v2.begin(); it != v2.end(); ++it)
        {
            V.push_back(*it);
        }
    }

    //repeat the above prcess for other vectors
    
}
#包括
#包括
int main()
{
std::向量v1{1,2,6};
std::向量v2{6,8,9};
std::向量v3{9,8,10};
std::向量v4{0,1};
std::vectorV{v1};
如果(v1.back()==v2.front())
{
对于(自动it=v2.begin()+1;it!=v2.end();+it)
{
V.推回(*it);
}
}
其他的
{
对于(自动it=v2.begin();it!=v2.end();+it)
{
V.推回(*it);
}
}
//对其他向量重复上述过程
}

您可以执行以下操作

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

int main() 
{
    std::vector<int> v1 = {1,2,6}, v2 = {6,8,9}, v3 = {9,8,10}, v4 = {0, 1};
    
    for ( auto p : { &v2, &v3, &v4 } )
    {
        auto it = std::begin( *p );

        if ( v1.back() == p->front() )
        {
            std::advance( it, 1 );
        }           

        v1.insert( std::end( v1 ), it, std::end( *p ) );
    }
    
    for ( const auto &item : v1 )
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';
    
    return 0;
}
或者可以在向量v1中预留足够的空间。比如说

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

int main() 
{
    std::vector<int> v1 = {1,2,6}, v2 = {6,8,9}, v3 = {9,8,10}, v4 = {0, 1};
    
    std::vector<int>::size_type n = v1.size();
    auto last = v1.back();
    
    for ( auto p : { &v2, &v3, &v4 } )
    {
        n += last == p->front() ? p->size() - 1 : p->size();
        last = p->back();
    }
    
    v1.reserve( n );
    
    for ( auto p : { &v2, &v3, &v4 } )
    {
        auto it = std::begin( *p );

        if ( v1.back() == p->front() )
        {
            std::advance( it, 1 );
        }           

        v1.insert( std::end( v1 ), it, std::end( *p ) );
    }
    
    for ( const auto &item : v1 )
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';
    
    return 0;
}
#包括
#包括
#包括
int main()
{
向量v1={1,2,6},v2={6,8,9},v3={9,8,10},v4={0,1};
std::vector::size_type n=v1.size();
auto last=v1.back();
对于(自动p:{&v2、&v3、&v4})
{
n+=last==p->front()?p->size()-1:p->size();
last=p->back();
}
v1.储备(n);
对于(自动p:{&v2、&v3、&v4})
{
自动it=std::begin(*p);
如果(v1.back()==p->front())
{
std::advance(it,1);
}           
插入(std::end(v1),it,std::end(*p));
}
用于(常数自动和项目:v1)
{

std::cout另一种解决方案是使用辅助容器,如
std::deque

#include <iostream>
#include <deque>
#include <vector>

std::vector<int> concat(const std::vector<std::vector<int>>& v2d)
{
    std::deque<int> sDeque;
    for (auto& v : v2d)
    {
        for (auto v2 : v)
        {
            if (sDeque.empty())
                sDeque.push_front(v2);
            else
            if ( sDeque.front() != v2 )
                sDeque.push_front(v2);
        }
    }
    return { sDeque.rbegin(), sDeque.rend() };
}

int main()
{
    auto v = concat({ {1,2,6}, {6,8,9}, {9,8,10}, {0, 1} });
    for (auto i : v)
        std::cout << i << " ";
}

请出示你的代码。你忘了问一个问题。你在找一个标准算法?@Morpheus这些向量{9,8,10},{0,1}是如何连接的?@Vladfrommoskow只是把它们放在一起{9,8,10,0,1}你是否认为它是无效的,或者你真的认为你的代码的这部分正在减慢你的程序,以至于它值得去改进它?通常人们担心性能的问题。我在路上。我会尽快发布代码。我确实添加了我的代码,但是你的看起来比我的更优雅。我应该添加I。nfo我不想破坏v1、v2、v3或v4。但我可以从这里开始。非常感谢!@Morpheus刚刚声明了一个新的向量,并在基于范围的for循环中包含元素&v1。对于
n+=
,我可能只是
std::accumulate
大小,如果它太大了~2,谁在乎呢?@Morpheus这是我的个人风格。我是s它使程序更具可读性。
1 2 6 8 9 8 10 0 1