请考虑此代码.我已经多次看过这种类型的代码了.words是一个本地向量.如何从函数中返回它?我们可以保证它不会死吗?
std::vector<std::string> read_file(const std::string& path)
{
std::ifstream file("E:\\names.txt");
if (!file.is_open())
{
std::cerr << "Unable to open file" << "\n";
std::exit(-1);
}
std::vector<string> words;//this vector will be returned
std::string token;
while (std::getline(file, token, ','))
{
words.push_back(token);
}
return words;
}
Run Code Online (Sandbox Code Playgroud) 我的问题很简单:std :: vector元素是否保证是连续的?在order word中,我可以使用指向std :: vector的第一个元素的指针作为C数组吗?
如果我的记忆力很好,那么C++标准就没有这样的保证.但是,如果元素不连续,那么std :: vector要求几乎不可能满足它们.
有人可以澄清一下吗?
例:
std::vector<int> values;
// ... fill up values
if( !values.empty() )
{
int *array = &values[0];
for( int i = 0; i < values.size(); ++i )
{
int v = array[i];
// do something with 'v'
}
}
Run Code Online (Sandbox Code Playgroud) C++中数组和向量之间有什么区别?差异的一个例子可能包括图书馆,象征,能力等.
数组包含特定类型的特定数量的元素.因此编译器可以在编译程序时保留所需的空间量,您必须指定数组在定义时将包含的元素的类型和数量.编译程序时,编译器必须能够确定此值.一旦定义了数组,就可以使用数组的标识符和索引来访问数组的特定元素.[...]数组是零索引的; 也就是说,第一个元素是索引0.这个索引方案表示指针和数组之间C++中的密切关系以及语言为指针算法定义的规则.
- C++袖珍参考
向量是动态大小的对象序列,提供阵列式
operator[]随机访问.成员函数push_back通过复制构造函数复制其参数,将该副本添加为向量中的最后一项,并将其大小增加1.pop_back通过删除最后一个元素来完全相反.从向量的末尾插入或删除项目需要分摊常数,并且从任何其他位置插入或删除需要线性时间.这些是载体的基础.他们还有很多东西.在大多数情况下,矢量应该是C风格数组的首选.首先,它们是动态大小的,这意味着它们可以根据需要增长.您不必进行各种研究以找出最佳静态大小,如C阵列的情况; 矢量会根据需要增长,如果需要,可以手动调整大小.其次,向量提供与at成员函数(但不是operator[])的边界检查,这样如果引用不存在的索引而不是简单地观察程序崩溃或更糟,继续执行损坏的数据,则可以执行某些操作.- C++ Cookbook
如何在C++中获取向量中的最大(或最小)值?
我在谷歌上看到了一些解决方案,但对我来说都没有意义:(
有人可以用简单明了的方式解释如何从矢量中获取最大值或最小值吗?假设它与数组大致相同,我错了吗?
我需要一个迭代器吗?我尝试过max_element但却一直出错?
vector<int>::const_iterator it;
it = max_element(cloud.begin(), cloud.end());
Run Code Online (Sandbox Code Playgroud)
错误:在'云'中请求成员'begin',这是非类型'int [10]'
编辑:我无法回答我自己的??? 所以我会把它放在这里......
哇,谢谢快速回复!我最终以这种方式做到了,你觉得好吗?
for (unsigned int i = 0; i < cdf.size(); i++)
if (cdf[i] < cdfMin)
cdfMin = cdf[i];
Run Code Online (Sandbox Code Playgroud)
哪里cdf是矢量.
我想从一行数据帧中创建一个向量.但我不想要行和列名称.我尝试了几件事......但没有运气.
这是我的数据框:
> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
a b c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0
Run Code Online (Sandbox Code Playgroud)
我试过了:
> newV <- as.vector(df[1,])
> newV
a b c
1 1 2 2.6
Run Code Online (Sandbox Code Playgroud)
但我真的想要这样的东西:
> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6
Run Code Online (Sandbox Code Playgroud)
任何帮助,非常感谢.
目标:从相等长度的向量列表中,创建一个矩阵,其中每个向量成为一行.
例:
> a <- list()
> for (i in 1:10) a[[i]] <- c(i,1:5)
> a
[[1]]
[1] 1 1 2 3 4 5
[[2]]
[1] 2 1 2 3 4 5
[[3]]
[1] 3 1 2 3 4 5
[[4]]
[1] 4 1 2 3 4 5
[[5]]
[1] 5 1 2 3 4 5
[[6]]
[1] 6 1 2 3 4 5
[[7]]
[1] 7 1 2 3 4 5
[[8]]
[1] 8 1 2 3 4 5 …Run Code Online (Sandbox Code Playgroud) 我有两个向量u和v.有没有办法找到一个四元数来表示从u到v的旋转?
所以,我有以下内容:
std::vector< std::vector <int> > fog;
Run Code Online (Sandbox Code Playgroud)
我非常天真地初始化它:
for(int i=0; i<A_NUMBER; i++)
{
std::vector <int> fogRow;
for(int j=0; j<OTHER_NUMBER; j++)
{
fogRow.push_back( 0 );
}
fog.push_back(fogRow);
}
Run Code Online (Sandbox Code Playgroud)
感觉非常错误......有没有另一种方法来初始化这样的矢量?
目标是访问字符串向量的"第n"元素,而不是[]运算符或"at"方法.根据我的理解,迭代器可用于浏览容器,但我以前从未使用过迭代器,而我正在阅读的内容令人困惑.
如果有人能给我一些如何实现这一目标的信息,我将不胜感激.谢谢.
我想使用erase方法从向量中清除元素.但是这里的问题是元素不能保证在向量中只出现一次.它可能存在多次,我需要清除所有这些.我的代码是这样的:
void erase(std::vector<int>& myNumbers_in, int number_in)
{
std::vector<int>::iterator iter = myNumbers_in.begin();
std::vector<int>::iterator endIter = myNumbers_in.end();
for(; iter != endIter; ++iter)
{
if(*iter == number_in)
{
myNumbers_in.erase(iter);
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> myNmbers;
for(int i = 0; i < 2; ++i)
{
myNmbers.push_back(i);
myNmbers.push_back(i);
}
erase(myNmbers, 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码显然崩溃了,因为我在迭代它时改变了向量的末尾.实现这一目标的最佳方法是什么?也就是说有没有办法做到这一点,而无需多次迭代矢量或创建一个矢量的副本?