以下代码中的注释部分会打印一些不明确的值。
未注释的版本打印:
1:one
这意味着如果在将对象添加到向量之前为类变量赋值,则会打印指定的值。但是如果我在将对象添加到向量后分配值,则它不会打印指定的值。
#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;
class T
{
public:
string t;
int n;
};
int main()
{
/**
std::vector<T>::iterator it;
vector<T>li;
it = li.begin();
T t1;
it = li.insert(it,t1);
t1.n = 1;
t1.t = "one";
it = li.begin();
T t2;
it = li.insert(it+1,t2);
it = li.begin();
T t3;
it = li.insert(it+2,t3);
cout << li.at(0).n << ":" << li.at(0).t << endl;
*/
std::vector<T>::iterator it;
vector<T>li;
it = li.begin();
T t1;
t1.n = 1;
t1.t = "one";
it = li.insert(it,t1);
it = li.begin();
T t2;
it = li.insert(it+1,t2);
it = li.begin();
T t3;
it = li.insert(it+2,t3);
cout << li.at(0).n << ":" << li.at(0).t << endl;
}
对于Java,它不是那样的。相反,无论在将对象添加到向量之前还是之后分配成员变量,都将打印该值。如何实现类似Java的功能?
答案 0 :(得分:1)
在行
T t1;
it = li.insert(it,t1);
你声明变量t1
并将其副本插入向量中,但你不做的是在插入之前初始化变量,这意味着副本在向量也未初始化。
以后再做
cout << li.at(0).n << ":" << li.at(0).t << endl;
您在矢量中打印出未初始化副本的值,这会导致未定义行为。未初始化的局部变量的内容/值是 indeterminate 并且看起来是随机的。
完成 的复制后,
答案 1 :(得分:1)
struct
或class
与其他类型的行为相同。它们只是一组类型。因此,当您声明T t1;
时,编译器看到的几乎就像
// grouped together in the name `t1`
string t;
int n;
因此,当您在向量中发送t1
时,它与Java中的int
完全相同,它会复制它。
您可以对此做些什么?
有两种解决方案。您可以更改向量内的T
的值,如下所示:
li[0] = {"aString", 23}
或者你可以插入指针。指针就像java中的对象一样。实际上,java中的对象是指针,但值是隐藏的。它看起来像这样:
vector<unique_ptr<T>> li;
// make unique is just a wrapper around the new to make a std::unique_ptr
li.emplace_back(make_unique<T>("aString", 23));
我真的建议您使用emplace_back
而不是迭代器和insert
。它将使您的代码更清晰,更快。