4

我正在尝试将矢量数据从以下复制sampleY

std::map<std::string, std::vector<double > >sample;
std::map<std::string, std::vector<double > >::iterator it1=sample.begin(), end1=sample.end();
std::vector<double> Y; 

并使用以下代码:

 while (it1 != end1) {
  std::copy(it1->second.begin(), it1->second.end(), std::ostream_iterator<double>(std::cout, " "));
++it1;
}

它可以打印输出,但是当我用下面的内容替换上面的 std::copy 块时,我得到了一个段错误。

 while (it1 != end1) {
std::copy(it1->second.begin(), it1->second.end(), Y.end());
++it1;
}

我只想将it1->second 的内容复制到Y。为什么它不起作用,我该如何解决?

4

2 回答 2

16

显然,您想将对象插入向量中。但是,std::copy()只需要传递的迭代器并写入它们。begin()和迭代器获得的end()迭代器不做任何插入。你想使用的是这样的:

std::copy(it1->second.begin(), it1->second.end(), std::back_inserter(Y));

std::back_inserter()函数模板是迭代器的工厂函数,它使用其push_back()参数来附加对象。

于 2012-04-30T02:45:28.030 回答
2
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;


int main() {
    // your code goes here
    vector<int> vec;
    vector<int> test;
    vec.push_back(1);
    //test.push_back(0);
    copy(vec.begin(),vec.begin()+1,test.begin());
    cout << *(test.begin());
    return 0;
}

输出:运行时错误时间:0 内存:3424 信号:11

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;


int main() {
    // your code goes here
    vector<int> vec;
    vector<int> test;
    vec.push_back(1);
    test.push_back(0);
    copy(vec.begin(),vec.begin()+1,test.begin());
    cout << *(test.begin());
    return 0;
}

输出: *成功时间:0 内存:3428 信号:0 *

1

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;


int main() {
    // your code goes here
    vector<int> vec;
    vector<int> test(5);
    vec.push_back(1);
    //test.push_back(0);
    copy(vec.begin(),vec.begin()+1,test.begin());
    cout << *(test.begin());
    return 0;
}

成功时间:0 内存:3428 信号:0

1

所以原因是你没有初始化向量,vector.begin() 指向某个受限的地方!当您使用 back_inserter(vector) 时,它会返回一个 back_insert_interator,它在内部使用 vector.push_back 而不是 *(deference) 操作。所以 back_inserter 有效!

于 2014-03-28T03:17:25.820 回答