如何解决在c ++ 17
即使在C ++中将两个std::vectors
串联起来也很简单,尤其是在使用范围的情况下,我还是有一个稍微不同的问题。
说我有以下向量:{1,2,6}
,{6,8,9}
,{9,10}
,依此类推。如果一个向量的尾部与要连接的下一个向量的头部相同,则我只希望最后一个向量中包含一个元素,如下所示:
conc({1,6},{6,9},{9,10},{0,1}) = {1,6,9,10,1}
我能够使用if
条件来执行此操作,但我认为这样做效率不高,因为我必须执行数十万次,最好使用STL而无需使用外部库。
如果可能会有帮助,则总是只有4个向量需要串联。
编辑:要连接的向量的结尾和开头可能有相同的元素,也可能没有。
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v1{1,6};
std::vector<int> v2{6,9};
std::vector<int> v3{9,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 <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector<int> v1 = {1,2,6},v2 = {6,8,9},v3 = {9,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;
}
程序输出为
1 2 6 8 9 8 10 0 1
或者您可以在向量v1中初步保留足够的空间。例如
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector<int> v1 = {1,1};
std::vector<int>::size_type n = v1.size();
auto last = v1.back();
for ( auto p : { &v2,&v4 } )
{
n += last == p->front() ? p->size() - 1 : p->size();
last = p->back();
}
v1.reserve( n );
for ( auto p : { &v2,std::end( *p ) );
}
for ( const auto &item : v1 )
{
std::cout << item << ' ';
}
std::cout << '\n';
return 0;
}
,
另一种解决方案是使用辅助容器,例如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,{6,{9,{0,1} });
for (auto i : v)
std::cout << i << " ";
}
输出:
1 2 6 8 9 8 10 0 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。