将std :: list附加到std :: list的向量中

时间:2019-07-02 06:40:30

标签: c++

我有一个向量,它是列表的集合,而该列表是整数的集合。喜欢:

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)已经存在。另一个期望是,我应该能够在主要函数中获取此信息。我在主函数中看不到任何输出。

我的期望哪里出错了?

2 个答案:

答案 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的调用,因此列表在您向其中写入元素时会不断增长。