【发布时间】:2021-03-24 07:37:42
【问题描述】:
我需要创建一个向量或类似的配对列表,其中配对的第一个元素属于 T 类,第二个元素是指向下一个配对的指针。 Illustration
template<class T>
std::vector<std::pair<T, T*>> createPointingVector(std::vector<T> vec) {
std::vector<std::pair<T, T*>> new_vec;
for (int i=0; i<vec.size(); i++){
new_vec.push_back(std::make_pair(vec[i], &(vec[i - 1])));
}
return new_vec;
}
我知道 std::vector<std::pair<T, T*>> 不正确,因为该对的第二个元素不应该是 *T 类型,而是递归 *std::pair<T, *std::pair<T, *std::pair<T, ...>>>。
是否可以修复我的代码或实现目标的其他方法(如果有)?
【问题讨论】:
-
new_vec.push_back(std::make_pair(vec[i], &(vec[i - 1])));-- 存储指向向量元素的指针是一场等待发生的灾难,因为在向量上调用push_back会使指向元素的指针无效。在我看来,那张图片只不过是一个简单的链表,而这对只是隐藏了这一点,即 -
你为什么要这个?我的意思是用例是什么?可能有更好的解决方案。
-
@PaulMcKenzie 我尝试创建 size = vec.size() 的 new_vector 并且不使用 push_back,但这并没有解决主要问题。 “链表”?会调查的。 JHBonarius 我不知道,我不会那样做。但这是外教给的任务。
-
图示只是变相的单链表:
template <typename T> struct Node (T data; Node<T>* next; };,在C++中封装在std::forward_list<T>中。 -
危险,蚂蚁澳大利亚!危险!!。 如果发生重新分配,所有与容器相关的迭代器、指针和引用都将失效。参见Iterator invalidation rules
标签: c++ pointers templates vector std-pair