单向交换向量,是否可能?

时间:2016-05-08 16:26:34

标签: c++ stl swap

在C ++ 98中,这就是我想要做的事情(这不起作用,因为_M_start等是私有成员):

//vectors are predefined already
std::vector<int> a;
std::vector<int> b(10000000,20);

//in later part of code
//a=b;  //expensive copy
//std::swap(a,b);   //inexpensive swap
vectormove(a,b);  //i need an inexpensive one way swap instead

这就是我想打电话的方式

        <?php

        $string = '<a href="http://www.example.com">test</a>    http://www.example.com';
        $rx     = array("&(<a.+https?:\/\/[\w]+[^ \,\"\n\r\t<]*>)(.*)(<\/a\>)&si", "&(\s){1,}(https?:\/\/[\w]+[^ \,\"\n\r\t<]*)&");
        $rp     = array("$1$2$3", "<a href=\"$2\">$2</a>");
        $string = preg_replace($rx,$rp, $string);

        var_dump($string);

        // DUMPS:
        // '<a href="http://www.example.com">test</a><a href="http://www.example.com">http://www.example.com</a>'

我可能通过使用副本,移动和交换松散地使用了术语,但我对这个主题没有更好的把握。我希望我能表达我的意图。

2 个答案:

答案 0 :(得分:1)

看起来你只想要a 引用到b的内部。这样做的方法就是:

std::vector<int>& a = b;

如果您希望a 接管 b的内部,那就是:

std::vector<int> a = std::move(b);

在C ++ 03中可以实现为带空向量的交换:

std::vector<int> a;
using std::swap;
swap(a, b);

答案 1 :(得分:0)

如果您的问题是如何撰写vectormove()的可编辑实施方式,请执行以下操作:

// NOT USEFUL CODE
void vectormove(std::vector<int>& a, std::vector<int>& b)
{
    memcpy(&b, &a, sizeof(std::vector<int>));
}

但是这没用,因为一旦你完成了这个,你就会走向未定义的行为。也许是双倍免费,也许是免费使用后等等。

您最好通过常规a.swap(b)或将a存储为类型int*来获得最佳服务,如下所示:

std::vector<int> b(10000000,20);
std::pair<int*, int*> a(&b[0], &b[b.size()]);

现在你有一个a可以廉价传递并引用原始向量。通过之后修改a,确保您不会使b无效。