我有 2std::vector
秒:
- 到第一个向量,我放置实例
- 到第二个向量,我想存储刚刚放置的实例的地址
但它不起作用,即存储的地址与放置实例的地址不同。
如果这很重要,我在 Linux 上并使用 g++ 5.1 和 clang 3.6 和 -std=c++11。
这是一个说明问题的工作示例。
#include <iostream>
#include <vector>
struct Foo {
Foo(int a1, int a2) : f1(a1), f2(a2) {}
int f1;
int f2;
};
int main(int, char**) {
std::vector<Foo> vec1;
std::vector<Foo*> vec2;
int num = 10;
for (int i = 0; i < num; ++i) {
vec1.emplace_back(i, i * i);
// I want to store the address of *emplaced* instance...
vec2.push_back(&vec1.back());
}
// same
std::cout << "size 1: " << vec1.size() << std::endl;
std::cout << "size 2: " << vec2.size() << std::endl;
// same for me
std::cout << "back 1: " << &vec1.back() << std::endl;
std::cout << "back 2: " << vec2.back() << std::endl;
// typically differ ?
std::cout << "front 1: " << &vec1.front() << std::endl;
std::cout << "front 2: " << vec2.front() << std::endl;
for (int i = 0; i < num; ++i) {
std::cout << i + 1 << "th" << std::endl;
// same for last several (size % 4) for me
std::cout << "1: " << &vec1[i] << std::endl;
std::cout << "2: " << vec2[i] << std::endl;
}
}
问题
- 这是正确的行为吗?我猜这是由存储临时实例的地址引起的,但我想知道标准是否允许(只是好奇)。
- 如果上述情况属实,如何解决这个问题?我通过将第一个更改为解决了这个问题,
vector<unique_ptr<Foo>>
但是有什么惯用的方法吗?