首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从c数组创建向量

从c数组创建向量
EN

Stack Overflow用户
提问于 2013-12-21 16:50:38
回答 4查看 409关注 0票数 1

试图从c-数组的部件(5个元素)中生成向量.

代码语言:javascript
复制
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数组的整个长度枚举向量项时,我得到了所有类似于向量的项都将被初始化为vector<int> vi2(ia, ia + size-5);。没有例外或错误,它会超出范围。

代码语言:javascript
复制
    for(int i = 0; i < size; i++) {
    cout << i << ":" << vi2[i] << " ";
}

产出:

代码语言:javascript
复制
0:1 1:2 2:3 3:4 4:5 5:6 6:7 7:8 8:9 9:10 

为什么向量初始化使用描述指针到数组结束的第二个参数,如果它不使用它呢?

EN

回答 4

Stack Overflow用户

发布于 2013-12-21 16:54:34

您正在访问超出界限的向量。这是不明确的行为。不需要抛出异常。

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

代码语言:javascript
复制
for(int i = 0; i < vi2.size(); ++i) 
{
  std::cout << i << ":" << vi2[i] << " ";
}
票数 3
EN

Stack Overflow用户

发布于 2013-12-21 16:58:47

[]运算符不执行任何边界检查(类似于C和C++中处理原始数组的[]操作符)。

如果希望引发异常,请使用at成员函数:

代码语言:javascript
复制
std::vector<int> v { 1, 2, 3, 4, 5 };
int invalidInt = v.at(5); // hell breaks lose, says the runtime
票数 2
EN

Stack Overflow用户

发布于 2013-12-21 16:54:14

如果您访问一个超出界限的索引,C++不会像Java那样抛出异常。这是未定义行为,你不能这么做。

代码语言:javascript
复制
for(int i = 0; i < vi2.size(); i++) {
    cout << i << ":" << vi2[i] << " ";
}

请参阅C和C++中未定义行为指南

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20721281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档