我有一个向量,它是列表的集合,而该列表是整数的集合。喜欢:
std::vector<std::list<int> > vec;
我试图在std :: vector的索引后面附加一个std :: list。
请考虑以下代码:
#include<iostream>
#include<list>
#include<vector>
namespace NM {
std::vector<std::list<int> > vec;
class CC {
public:
static void func();
};
}
void NM::CC::func() {
std::list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
std::copy(l1.begin(), l1.end(), NM::vec.at(0).end());
// NM::ccInfo[0] = l1;
}
int main() {
NM::vec.resize(2);
NM::CC::func();
int index = 0;
for (; index != 1; index++) {
std::list<int> l2 = NM::vec.at(index);
std::list<int>::iterator it = l2.begin();
for (; it != l2.end(); ++it) {
std::cout << "Int = " << *it << std::endl;
}
}
}
我希望它可以将list(l1)附加到func函数内的NM :: vec.at(0),如果MM :: vec.at(0)已经存在。另一个期望是,我应该能够在主要函数中获取此信息。我在主函数中看不到任何输出。
我的期望哪里出错了?
答案 0 :(得分:4)
您的代码具有未定义的行为,因为它试图直接写到NM::vec.at(0).end()
及其之后。
要追加到列表中,请将该行替换为以下内容:
std::copy(l1.begin(), l1.end(), std::back_inserter(NM::vec.at(0)));
答案 1 :(得分:3)
这里
std::copy(l1.begin(), l1.end(), NM::vec.at(0).end());
您正在复制到一个空列表。 std::copy
默认情况下不会将元素添加到列表中,而是将其复制到现有列表元素上。这是一个常见的误解。
要执行此操作,您需要使用一个方便的函数,称为std::back_inserter
#include <iterator>
std::copy(l1.begin(), l1.end(), std::back_inserter(NM::vec.at(0)));
std::back_inserter
将对列表的写入转换为对push_back
的调用,因此列表在您向其中写入元素时会不断增长。