【问题标题】:Initialising a reference to a class within a vector of pairs using a pointer to a pointer to an instance of that class使用指向该类实例的指针初始化对向量中的类的引用
【发布时间】:2016-11-10 00:08:53
【问题描述】:

对于冗长的标题,我深表歉意,但我注意到一个奇怪的行为,无论我做了多少测试,我都无法理解。我希望有人能阐明这里发生的事情,以及这是否是由于我做错了什么。

我创建了一个自定义类“T”的向量“v”,我用独特的对象填充了它。我想将此向量用作一种参考表。

我创建了一个由“T”指针组成的向量“vp”,它的每个元素都指向“v”中的一个特定的唯一元素。然后我打乱了“vp”并为其创建了一个迭代器“i”,这意味着我可以遍历“vp”并以随机顺序获得唯一的“T”,而无需修改“v”。

然后我创建了一个类型对的向量,目的是用随机的“T”填充它。但是我发现,每次将一个新元素添加到这个对向量中时,T& 的值都会更新为“i”的当前值。这是什么原因,(假设我必须使用这种方法)有什么办法可以避免它?我试图描述的简化代码如下:

std::vector<T> v{ ... }; //Contains list of unique 'T's
std::vector<T*> vp{};

for (std::vector<T>::const_iterator iElement = v.begin(); iElement < v.end(); ++iElement)
 vp.push_back(&(*iElement));

//Code for swapping elements of vp goes here

std::vector<std::pair<T&, int>> classVector{};
std::vector<T*>::iterator i{ vp.begin() };

for (int n = 0; n < 5; ++n)
{
 classVector.push_back(std::make_pair(**i, 1));
 ++i;
}

感谢您的帮助。

编辑:错误地使用了 for each 循环来迭代 v,改为迭代器。

【问题讨论】:

  • 那是标题的开膛手;-)
  • for (T t : v) 正在制作v 中对象的临时副本,指向这些对象的指针将立即失效。
  • 谢谢你是对的。我在写的时候遇到了这个问题,解决后很快就忘记了,所以当我开始编写示例代码时,我试图简化它。我将对其进行编辑并记下。
  • 最好编译您发布的示例代码,以确保它显示的错误与您的真实代码相同。
  • 好建议,我以后会这样做的。

标签: c++ pointers vector reference


【解决方案1】:
#include <vector>
#include <string>
#include <iostream>

int main() {
    std::vector<std::string> v{"111", "2222", "3333"};
    std::vector<const std::string*> vp;

    for (const auto& element : v) {
        vp.push_back(&element);
        std::cout << &element <<std::endl;
    }

    std::vector<std::pair<const std::string&, int>> classVector{};
    auto i = vp.begin();

    for (int n = 0; n < v.size(); ++n) {
        classVector.push_back(std::make_pair(**i, 1));
        std::cout << (**i) << std::endl;
        i++;
    }
    // prints same element
    for(const auto& e : classVector) {
        std::cout << (e.first) << std::endl;
    }
}

这是一个编译的抽象 c++11 示例代码,您正在尝试执行此操作,我将尝试解释它的问题。基本上,您将一对推入向量,该对的第一个元素是迭代器 i 指向的任何字符串的引用(对不起,措辞复杂,但您所做的事情很复杂,我不明白这一点:) )。获取指针是另一回事,因为指针被复制(地址被复制而不是指向的内容)。所以你去第一个元素复制它的地址,去第二个副本它的地址等等。参考不一样!!上面的代码引用了迭代器指向的任何字符串,所以当迭代器继续前进时,引用是指 i 当前指向的字符串。

【讨论】:

    猜你喜欢
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多