Вы не можете сделать это, используя встроенные массивы. Тот факт, что массивы не являются ни назначаемыми, ни копируемыми. Также они не являются классами, поэтому у них нет функций-членов, таких как size()
, или они принимают Initializer-list.
Этого можно добиться с помощью std::array
, если размер постоянен, или с помощью std::vector
, если размер динамический.
#include <array>
int func(const std::array<int, 5>& values) {
int average = 0;
for (size_t x{}, sz{ values.size() }; x != sz ; ++x)
average += values[x];
return average / values.size();
}
int main() {
auto ret{
func({ 1, 6, 7, 2 })
};
std::cout << ret << std::endl;
}
Также не смешивайте Unsigned с Signed в вычислениях, как в вашем цикле:
for(int x = 0; x < values.size(); x++) // x is int while values.size() is unsigned int.
int func(const std::array<int, 5>& values)
: передать по ссылке на избегайте копирования, особенно если размер большой. Также проходите через const, пока функция не намеревается изменить параметр, также еще одно преимущество использования ссылки на const - вы можете передавать литералы вместо объекта.
Примечание: я рекомендую также использовать range-based for
, потому что это действительно актуально в вашем примере, если вы хотите перебрать все элементы и не намереваться insert
или delete
элементов:
int average = 0;
for (const auto& e : values)
average += e;
Другая версия func
, на которую указывает @MM, заключается в том, чтобы использовать std::accumalate
для выполнения этой работы за вас:
int func(const std::array<int, 5>& values) {
return std::accumulate(values.begin(), values.end(), 0) /
values.size();
}
Если бы Вы хотели придерживаться строк, то что-то вроде этого работало бы...
TreeNode root = new TreeNode();
TreeNode node = root;
treeView1.Nodes.Add(root);
foreach (string filePath in myList) // myList is your list of paths
{
node = root;
foreach (string pathBits in filePath.Split('/'))
{
node = AddNode(node, pathBits);
}
}
private TreeNode AddNode(TreeNode node, string key)
{
if (node.Nodes.ContainsKey(key))
{
return node.Nodes[key];
}
else
{
return node.Nodes.Add(key, key);
}
}
Я превратил бы строку в FileInfo.
После того как Вы сделали, чтобы FileInfo возразил, можно использовать свойство Directory для получения DirectoryInfo для каждого пути.
После того как у Вас есть DirectoryInfo для пути, легко "идти" по Родительской ссылке в DirectoryInfo для превращения каждого пути к списку каталогов + имя файла - т.е.:
{"C:","Windows","Temp","ErrorLog.txt"}
Это должно быть довольно просто для вставки в treeview. Просто ищите каждый раздел пути в свою очередь, и если он не существует, добавьте его....
дайте рекурсии попытку.
private void AddFiles()
{
// Iterate your list with FileInfos here
foreach( var fileInfo in new Collection<FileInfo>() )
{
GetOrCreateTreeNode( fileInfo.Directory ).Nodes.Add( new TreeNode( fileInfo.Name ) );
}
}
private TreeNode GetOrCreateTreeNode( DirectoryInfo directory )
{
if( directory.Parent == null )
{
// Access your TreeView control here:
var rootNode = <TreeView>.Nodes[directory.Name];
if( rootNode == null )
{
rootNode = new TreeNode(directory.Name);
// Access your TreeView control here:
<TreeView>.Nodes.Add( rootNode );
}
return rootNode;
}
var parent = GetOrCreateTreeNode( directory.Parent );
var node = parent.Nodes[directory.Name];
if( node == null )
{
node = new DirectoryNode( directory );
parent.Nodes.Add( node );
}
return node;
}
Этот код должен дать Вам только идею - я должен признать, что не протестировал его прежде, чем отправить здесь.
private void Form1_Load(object sender, EventArgs e)
{
var paths = new List<string>
{
@"C:\WINDOWS\AppPatch\MUI\040C",
@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727",
@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI",
@"C:\WINDOWS\addins",
@"C:\WINDOWS\AppPatch",
@"C:\WINDOWS\AppPatch\MUI",
@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI\0409"
};
treeView1.PathSeparator = @"\";
PopulateTreeView(treeView1, paths, '\\');
}
private static void PopulateTreeView(TreeView treeView, IEnumerable<string> paths, char pathSeparator)
{
TreeNode lastNode = null;
string subPathAgg;
foreach (string path in paths)
{
subPathAgg = string.Empty;
foreach (string subPath in path.Split(pathSeparator))
{
subPathAgg += subPath + pathSeparator;
TreeNode[] nodes = treeView.Nodes.Find(subPathAgg, true);
if (nodes.Length == 0)
if (lastNode == null)
lastNode = treeView.Nodes.Add(subPathAgg, subPath);
else
lastNode = lastNode.Nodes.Add(subPathAgg, subPath);
else
lastNode = nodes[0];
}
}
}