从c-array创建矢量

时间:2013-12-21 16:50:38

标签: c++

尝试从c-array的 part (5个元素)制作矢量。

const static int size = 10;
cout << "vector from C-array: " << endl;
int ia[size] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int> vi2(ia, ia + size-5);

但是当我尝试使用整个c-array长度计算向量项时,我得到像vector这样的所有项目都会被初始化为vector<int> vi2(ia, ia + size-5);。没有异常或错误超出范围。

    for(int i = 0; i < size; i++) {
    cout << i << ":" << vi2[i] << " ";
}

在输出中:

0:1 1:2 2:3 3:4 4:5 5:6 6:7 7:8 8:9 9:10 

为什么向量初始化使用第二个参数来描述指向数组末尾的指针(如果它没有使用它?)

4 个答案:

答案 0 :(得分:3)

您正在访问您的向量越界。这是未定义的行为。不要求抛出异常。

您不能超越vi2.size()-1

for(int i = 0; i < vi2.size(); ++i) 
{
  std::cout << i << ":" << vi2[i] << " ";
}

答案 1 :(得分:2)

[]运算符不进行任何边界检查(类似于C和C ++中与原始数组一起使用的[]运算符)。

如果要抛出异常,请使用at成员函数:

std::vector<int> v { 1, 2, 3, 4, 5 };
int invalidInt = v.at(5); // hell breaks lose, says the runtime

答案 2 :(得分:1)

如果访问越界索引,C ++不会像Java那样抛出异常。它是undefined behavior,你根本不能这样做。

for(int i = 0; i < vi2.size(); i++) {
    cout << i << ":" << vi2[i] << " ";
}

请参阅A Guide to Undefined Behavior in C and C++

  

安全编程语言中,错误会在发生时被捕获。例如,Java通过其异常系统在很大程度上是安全的。在不安全的编程语言中,错误不会被捕获。相反,在执行错误操作之后,程序继续运行,但是以一种无声的错误方式,可能会在以后产生可观察到的后果。

答案 3 :(得分:1)

如果您确实希望在超出界限时抛出异常,请使用.at()

for(int i = 0; i < size; i++) {
    cout << i << ":" << vi2.at(i) << " ";
}

话虽如此,请更好地使用vi2vi2.size())的实际尺寸。